java十五章_Java8 教程第十五章之Optional 用法

本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。

本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.

引子

Java 8在java.util包中引入了一个新类Optional。 它用于表示存在或不存在的值。 这个新构造的主要优点是没有太多的空检查和NullPointerException。 它避免了任何运行时NullPointerExceptions,并支持我们开发干净整洁的Java API或应用程序。 与集合和数组一样,它也是一个容纳最多一个值的容器。 让我们用一些有用的例子来探索这个新的构造。

那么在java8 中:

需要空检查

在运行时不再有NullPointerException

我们可以开发干净整洁的API

Optional 基础例子

public static void main(String[] args) {

Optional gender = Optional.of("MALE");

String answer1 = "Yes";

String answer2 = null;

System.out.println("Non-Empty Optional:" + gender);

System.out.println("Non-Empty Optional: Gender value : " + gender.get());

System.out.println("Empty Optional: " + Optional.empty());

System.out.println("ofNullable on Non-Empty Optional: " + Optional.ofNullable(answer1));

System.out.println("ofNullable on Empty Optional: " + Optional.ofNullable(answer2));

// java.lang.NullPointerException

System.out.println("ofNullable on Non-Empty Optional: " + Optional.of(answer2));

}

输出内容

Non-Empty Optional:Optional[MALE]

Non-Empty Optional: Gender value : MALE

Empty Optional: Optional.empty

ofNullable on Non-Empty Optional: Optional[Yes]

ofNullable on Empty Optional: Optional.empty

Exception in thread "main" java.lang.NullPointerException

at java.util.Objects.requireNonNull(Objects.java:203)

at java.util.Optional.(Optional.java:96)

at java.util.Optional.of(Optional.java:108)

at Java82.main(Java82.java:30)

Optional的map和flatMap用法

public static void main(String[] args) {

Optional nonEmptyGender = Optional.of("male");

Optional emptyGender = Optional.empty();

System.out.println("不为空 Optional:: " + nonEmptyGender.map(String::toUpperCase));

System.out.println("空 Optional :: " + emptyGender.map(String::toUpperCase));

Optional> nonEmptyOtionalGender = Optional.of(Optional.of("male"));

System.out.println("Optional value :: " + nonEmptyOtionalGender);

System.out.println("Optional.map :: " + nonEmptyOtionalGender.map(gender -> gender.map(String::toUpperCase)));

System.out.println("Optional.flatMap :: " + nonEmptyOtionalGender.flatMap(gender -> gender.map(String::toUpperCase)));

}

输出

不为空 Optional:: Optional[MALE]

空 Optional :: Optional.empty

Optional value :: Optional[Optional[male]]

Optional.map :: Optional[Optional[MALE]]

Optional.flatMap :: Optional[MALE]

Optional filter用法

public static void main(String[] args) {

Optional gender = Optional.of("MALE");

Optional emptyGender = Optional.empty();

//Filter on Optional

System.out.println(gender.filter(g -> g.equals("male"))); //Optional.empty

System.out.println(gender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional[MALE]

System.out.println(emptyGender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional.empty

}

输出

Optional.empty

Optional[MALE]

Optional.empty

Optional 中 isPresent 和 ifPresent的用法

如果给定的Optional对象非空,则Optional.isPresent()返回true。否则返回false

public static void main(String[] args) {

Optional gender = Optional.of("MALE");

Optional emptyGender = Optional.empty();

if (gender.isPresent()) {

System.out.println("Value available.");

} else {

System.out.println("Value not available.");

}

gender.ifPresent(g -> System.out.println("不会报空指针"));

//condition failed, no output print

emptyGender.ifPresent(g -> System.out.println("不会报空指针"));

}

输出

Value available.

不会报空指针

Optional orElse 方法

解释:如果在Optional Container中存在,则返回该值。否则返回给定的默认值。

public static void main(String[] args) {

Optional gender = Optional.of("梁思前");

Optional emptyGender = Optional.empty();

System.out.println(gender.orElse("")); //梁思前

System.out.println(emptyGender.orElse("")); //

System.out.println(gender.orElseGet(() -> "")); //梁思前

System.out.println(emptyGender.orElseGet(() -> "")); //

}

输出

梁思前

梁思前

其实看到这里大家应该看懂了吧, 其实就是一个if else的逻辑, 这样看起来更清爽,而且会提示你让你强制判断空指针的问题,从而告别空指针.

欢迎留言讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值