Optional,Java
Java-java教程
仿当图网源码PHP,ubuntu主题安装教程,油猴爬虫优势,php var ¥,河南seo教学lzw
本文主要介绍Java 8
的 Optional
的简单使用
go语言源码,vscode图标展示不出来,irst安装Ubuntu,tomcat能让外网访问,网络爬虫比例,webftp php,seo建设公司怎么样,php的网站lzw
Addressc实现udp打洞源码,vscode怎么调试控制台,ubuntu源在哪,单tomcat 并发量,爬虫与昆虫,php 抓包工具,信阳seo优化关键词公司,钓鱼网站建设lzw
1 2 3 4 5 6 7 | @Data @AllArgsConstructor @NoArgsConstructor public class Address { private String province; private String city; } |
of + ofNullable
相关代码托管在java8_demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Test(expected = NoSuchElementException.class) public void emptyTest() { // 声明一个空的Optional对象 Optional nameOptional = Optional.empty(); // java.util.NoSuchElementException: No value present nameOptional.get(); } @Test(expected = NullPointerException.class) 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); } |
map
Stream.map
的定义: Stream map(Function mapper)
Optional.map
的定义: Optional map(Function mapper)
上面两者定义非常类似,Optional
可看成最多包含一个元素
的 Stream
1 2 3 4 5 6 7 8 9 10 11 | @Test public void mapTest() { String province = “Guangdong”; String city = “Zhongshan”; Optional addressOptional = Optional.of(new Address(province, city)); // mapper : Address -> String // Optional -> Optional Optional stringOptional = addressOptional.map(Address::getCity); assertTrue(stringOptional.isPresent()); assertEquals(city, stringOptional.get()); } |
flatMap
Stream.flatMap
的定义: Stream flatMap(Function<? super T, ? extends Stream> mapper)
Optional.flatMap
的定义: Optional flatMap(Function<? super T, Optional> mapper)
1 2 3 4 5 6 7 8 9 10 11 12 | @Test public void flatmapTest() { String province = “Guangdong”; String city = “Zhongshan”; Optional addressOptional = Optional.of(new Address(province, city)); // 对于 mapper 为 T -> Optional时,调用Optional.map,生成的是Optional<Optional> Optional<Optional> optionalOptional = addressOptional.map(address -> Optional.ofNullable(address.getCity())); // 对于 mapper 为 T -> Optional时,调用Optional.map,生成的是Optional,被扁平化 Optional stringOptional = addressOptional.flatMap(address -> Optional.ofNullable(address.getCity())); 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 | @Test(expected = UnsupportedOperationException.class) 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); } |
filter
1 2 3 4 | @Test public void filterTest() { assertTrue(addressOptional.filter(address -> address.getCity().contains(“Z”)).isPresent()); } |
基础类型 + Optional
OptionalInt
、OptionalLong
、OptionalDouble
最多只有一个
元素,并没有像StreamInt
那样相对于 Stream
有性能优势
不支持 map
、 flatmap
、 filter