Java8新特性之Optional

栏目: 编程语言 · Java · 发布时间: 6年前

内容简介:上一篇小乐带大家了解了Java8新特性之Stream,接下来将会继续述说Java新特性之OptionalOptional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

上一篇小乐带大家了解了 Java 8新特性之Stream,接下来将会继续述说Java新特性之Optional

Java8新特性之Optional

Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

1、of

为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException

Optional<Integer> optional = Optional.of(13);
System.out.println(optional)

2、ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);

3、isPresent

如果值存在返回true,否则返回false。

Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
System.out.println(optional2.isPresent());

optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());

4、get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());

5、ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。

public static void main(String[] args) {
    String str1 = "hello";
    String str2 = null;
    Optional<String> optional1 = Optional.ofNullable(str1);
    Optional<String> optional2 = Optional.ofNullable(str2);

    optional1.ifPresent(str->System.out.println(str.length()));
    optional2.ifPresent(str-> System.out.println(str.length()));
}

6、orElse

如果有值则将其返回,否则返回指定的其它值。

public static void main(String[] args) {
    String str1 = "hello";
    String str2 = null;
    Optional<String> optional1 = Optional.ofNullable(str1);
    Optional<String> optional2 = Optional.ofNullable(str2);
    System.out.println(optional1.orElse("默认字符串"));
    System.out.println(optional2.orElse("默认字符串"));
}

7、orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的一个值作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

public static void main(String[] args) {
    Integer i = 20;
    Optional<Integer> op = Optional.ofNullable(i);
    System.out.println(op.orElseGet(()->0));
    System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}

8、orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

public static void main(String[] args) {
    // 自己指定异常
    System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException())));
    System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}

9、map

map处理有值的情况,如果有值,则对其执行调用map参数中的函数得到返回值,否则返回空Optional。

public static void main(String[] args) {
   List<String> list = new ArrayList<String>(){
       {
            add("aaa");
            add("bbb");
            add(null);
       }
   };

   list.stream().forEach(temp ->{
        Optional<String> opt = Optional.ofNullable(temp);
        System.out.println(opt.map(n -> {
           return n.toUpperCase();
        }).orElse("Nothing"));
   });

   // 简写为如下形式
    list.stream().forEach(temp->{
        System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse("Nothing"));
    });
}

10、flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。 可以将内容

public static void main(String[] args) {
    Optional<String> opt1 = Optional.ofNullable("aaa");
    Optional<String> opt2 = Optional.ofNullable(null);
    System.out.println(opt1.flatMap(n->{
        return Optional.ofNullable(n.toUpperCase());
    }).orElse("还会没有吗"));

    System.out.println( opt2.flatMap(n->{
        return Optional.ofNullable(n.toUpperCase());
    }).orElse("还会没有吗"));
}

11、filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

public static void main(String[] args) {
    Optional<String> opt1 = Optional.ofNullable("aabbbbaa");
    Optional<String> opt2 = Optional.ofNullable(null);

    System.out.println(opt1.filter(value->value.length()>6));
    System.out.println(opt2.filter(value->value.length()>6));
}

好了,Java8新特性之Optional就介绍到这里了,接下去小乐将会继续带大家了解Java8新特性,请继续关注,转载请说明出处和作者。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

30天自制操作系统

30天自制操作系统

[日] 川合秀实 / 周自恒、李黎明、曾祥江、张文旭 / 人民邮电出版社 / 2012-8 / 99.00元

自己编写一个操作系统,是许多程序员的梦想。也许有人曾经挑战过,但因为太难而放弃了。其实你错了,你的失败并不是因为编写操作系统太难,而是因为没有人告诉你那其实是一件很简单的事。那么,你想不想再挑战一次呢? 这是一本兼具趣味性、实用性与学习性的书籍。作者从计算机的构造、汇编语言、C语言开始解说,让你在实践中掌握算法。在这本书的指导下,从零编写所有代码,30天后就可以制作出一个具有窗口系统的32位......一起来看看 《30天自制操作系统》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具