本文主要介绍java 8的 optional 的简单使用
|
1
2
3
4
5
6
7
|
public class Address {
private String province;
private String city;
}
|
相关代码托管在java8_demo
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public void emptyTest() {
// 声明一个空的Optional对象
Optional nameOptional = Optional.empty();
// java.util.NoSuchElementException: No value present
nameOptional.get();
}
public void ofNullTest() {
// 依据实例创建Optional对象
Optional.of(new Address("Guangdong", "Zhongshan"));
// Optional.ofNullable(null)返回Optional.empty()
assertEquals(Optional.empty(), Optional.ofNullable(null));
// java.lang.NullPointerException
Optional.of(null);
}
|
Stream.map的定义:<r> Stream<r> map(Function super T, ? extends R> mapper)</r></r>
Optional.map的定义:<u> Optional<u> map(Function super T, ? extends U> mapper)</u></u>
立即学习“Java免费学习笔记(深入)”;
上面两者定义非常类似,Optional可看成最多包含一个元素的 Stream

1、二手货品在线注册, 在线生效; 2、二手货品登陆后自动EMAIL回复功能; 3、登记货品用户修改时忘记密码,自动回复到登陆者信箱; 4、支持版主修改删除货品; 5、支持版主设置货品点击次数, 以提高排行榜名次; 6、使用JAVA SCRPIT 支持自动分页,不会因分页过多而导致显示混乱; 7、提供点击计数功能, 同一IP点击多次无效; 8、提供广告管理程序,程序可以循环放映广告,可设置添加删除
0
|
1
2
3
4
5
6
7
8
9
10
11
|
public void mapTest() {
String province = "Guangdong";
String city = "Zhongshan";
Optional addressOptional = Optional.of(new Address(province, city));
// mapper : Address -> String
// Optional -> Optional
Optional
assertTrue(stringOptional.isPresent());
assertEquals(city, stringOptional.get());
}
|
Stream.flatMap的定义:<r> Stream<r> flatMap(Function super T, ? extends Stream extends R>> mapper)</r></r>
Optional.flatMap的定义:<u> Optional<u> flatMap(Function super T, Optional<u>> mapper)</u></u></u>

|
1
2
3
4
5
6
7
8
9
10
11
12
|
public void flatmapTest() {
String province = "Guangdong";
String city = "Zhongshan";
Optional addressOptional = Optional.of(new Address(province, city));
// 对于 mapper 为 T -> Optional时,调用Optional.map,生成的是Optional
Optional
// 对于 mapper 为 T -> Optional时,调用Optional.map,生成的是Optional,被扁平化
Optional
assertTrue(stringOptional.isPresent());
assertEquals(city, stringOptional.get());
}
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public void dereferenceTest() {
// get:最简单 + 最不安全
Address address = addressOptional.get();
assertNotNull(address);
address = null;
Optional emptyAddressOptional = Optional.ofNullable(address);
String defaultValue = "Unknown";
// orElse:设置默认值
Address elseAddress = emptyAddressOptional.orElse(new Address(defaultValue, defaultValue));
assertEquals(defaultValue, elseAddress.getProvince());
assertEquals(defaultValue, elseAddress.getCity());
// orElseGet:orElse的延迟调用版本
Address elseGetAddress = emptyAddressOptional.orElseGet(Address::new);
assertNull(elseGetAddress.getProvince());
assertNull(elseGetAddress.getCity());
// ifPresent:存在值则运行consumer,否则不进行任何操作
emptyAddressOptional.ifPresent(System.out::println);
// orElseThrow:不存在时,抛出异常
emptyAddressOptional.orElseThrow(UnsupportedOperationException::new);
}
|
|
1
2
3
4
|
public void filterTest() {
assertTrue(addressOptional.filter(address -> address.getCity().contains("Z")).isPresent());
}
|
OptionalInt、OptionalLong、OptionalDouble
最多只有一个元素,并没有像StreamInt那样相对于 Stream<integer></integer> 有性能优势
不支持 map 、 flatmap 、 filter
以上就是Java 8——Optional的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号