原创

Java8新特性之Optional

https://img.luoyuanxiangvip.com/blogImg/1561448446718.jpg

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

1、of

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

        
  • 1
  • 2
Optional<Integer> optional = Optional.of(13); System.out.println(optional);
        
  • 1
Optional[13]

2、ofNullable

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

        
  • 1
  • 2
  • 3
  • 4
Optional<String> optional2 = Optional.ofNullable(null); System.out.println(optional2); optional2 = Optional.ofNullable("aaa"); System.out.println(optional2);
        
  • 1
  • 2
Optional.empty Optional[aaa]

3、isPresent

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
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());
        
  • 1
  • 2
  • 3
  • 4
Optional.empty false Optional[aaa] true

4、get

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

        
  • 1
  • 2
  • 3
  • 4
Optional optional2 = Optional.ofNullable("aaa"); System.out.println(optional2); System.out.println(optional2.isPresent()); System.out.println(optional2.get());
        
  • 1
  • 2
  • 3
Optional[aaa] true aaa

5、ifPresent

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
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()));
        
  • 1
5

6、orElse

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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("默认字符串"));
        
  • 1
  • 2
hello 默认字符串

7、orElseGet

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

        
  • 1
  • 2
  • 3
  • 4
Integer i = 20; Optional<Integer> op = Optional.ofNullable(i); System.out.println(op.orElseGet(()->0)); System.out.println(Optional.ofNullable(null).orElseGet(()->0));
        
  • 1
  • 2
20 0

8、orElseThrow

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

        
  • 1
  • 2
  • 3
// 自己指定异常 System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException()))); System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
        
  • 1
  • 2
  • 3
  • 4
  • 5
a Exception in thread "main" java.lang.IndexOutOfBoundsException at com.luoyuanxiang.admin.OptionalTests.lambda$main$1(OptionalTests.java:18) at java.util.Optional.orElseThrow(Optional.java:290) at com.luoyuanxiang.admin.OptionalTests.main(OptionalTests.java:18)

9、map

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
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")); }); }
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
AAA BBB Nothing AAA BBB Nothing

10、flatMap

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
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("还会没有吗")); }
        
  • 1
  • 2
AAA 还会没有吗

11、filter

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

        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
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)); }
        
  • 1
  • 2
Optional[aabbbbaa] Optional.empty

本文于   2019/7/1 下午  发布在  宁静寺  分类下,当前已被围观  26  次

相关标签: 学习 网络安全 思考 生活 Web开发

永久地址: https://luoyuanxiangvip.com/article/8

版权声明: 自由转载-署名-非商业性使用   |   Creative Commons BY-NC 3.0 CN