Java 8——Optional

本文主要介绍Java 8的 Optional 的简单使用

Address


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<Address> 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

  1. Stream.map的定义:<R> Stream<R> map(Function<? super T, ? extends R> mapper)
  2. Optional.map的定义:<U> Optional<U> map(Function<? super T, ? extends U> mapper)
  3. 上面两者定义非常类似,Optional可看成最多包含一个元素的 Stream


1

2

3

4

5

6

7

8

9

10

11


@Test

public void mapTest() {

String province = "Guangdong";

String city = "Zhongshan";

Optional<Address> addressOptional = Optional.of(new Address(province, city));

// mapper : Address -> String

// Optional<Address> -> Optional<String>

Optional<String> stringOptional = addressOptional.map(Address::getCity);

assertTrue(stringOptional.isPresent());

assertEquals(city, stringOptional.get());

}

flatMap

  1. Stream.flatMap的定义:<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  2. Optional.flatMap的定义:<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)


1

2

3

4

5

6

7

8

9

10

11

12


@Test

public void flatmapTest() {

String province = "Guangdong";

String city = "Zhongshan";

Optional<Address> addressOptional = Optional.of(new Address(province, city));

// 对于 mapper 为 T -> Optional<U>时,调用Optional.map,生成的是Optional<Optional<U>>

Optional<Optional<String>> optionalOptional = addressOptional.map(address -> Optional.ofNullable(address.getCity()));

// 对于 mapper 为 T -> Optional<U>时,调用Optional.map,生成的是Optional<U>,被扁平化

Optional<String> 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<Address> 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

  1. OptionalIntOptionalLongOptionalDouble
  2. 最多只有一个元素,并没有像StreamInt那样相对于 Stream<Integer> 有性能优势
  3. 不支持 map 、 flatmap 、 filter
时间: 2024-10-13 08:19:37

Java 8——Optional的相关文章

一句话介绍 之 java.util.Optional

废话少说:java.util.Optional 类可以大大减少 null 判断以及 NullPointerException 的异常发生. 1. Optional.of Optional.of(null);//报 NullPointerException ,这方法不常用 2. Optional.ofNullable Optional.ofNullable(null);//不报异常 3. Optional.get Optional.ofNullable(null).get();//报空指针异常 4

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPointException,简称 NPE)可以说是所有 Java 程序员都遇到过的一个异常,虽然 Java 从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而 Java 设计者也只能是让指针在 Java 语言中变得更加简单易用,而不能完全剔除,所以才有了常见对的关键字 null. 避

Java 8 Optional类深度解析

身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数.这正是一些类似Guava的外部API试图解决的问题.一些JVM编程语言比如Scala.Ceylon等已经将对在核心API中解决了这个问题.在我的前一篇文章中,介绍了Scala是如何解决了这个问题. 新版本的Java,比如Java 8引入了一个新的Optional类.Optional类的Javadoc

[转]Java 8 Optional类深度解析(null处理)

原文链接:http://www.importnew.com/6675.html 本文由 ImportNew - 高俊阳 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数.这正是一些类似Guava的外部API试图解决的问题.一些JVM编程语言比如Scala.Ceylon等已经将

java 8 Optional

of 为非null的值创建一个Optional. ofNullable 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional. isPresent 如果值存在返回true,否则返回false. get 如果Optional有值则将其返回,否则抛出NoSuchElementException. ifPresent 如果Optional实例有值则为其调用consumer,否则不做处理 orElse 如果有值则将其返回,否则返回指定的其它值. orElseGet

java Map Optional

public Map<Integer,String> getCity(List<Integer> cityIds) throws Exception{ Map<Integer,String> cityNames = new LinkedHashMap<>(); List<CityMapping> citys = this.getAllCity(); for(Integer cityId : cityIds) { Optional<CityM

Java中Optional使用注意事项

前言 之前遇到过使用Optional之后带来的隐含bug,现在强调记录一下不好的用法,防止错用. Optional不能序列化,不能作为类的字段(field) 这点尤为重要,即类要纯粹.如果是POJO就原始类型就可以了,如果是领域对象,则更不应该使用Optional作为field. Optional不能作为方法参数 另一种不太适合使用Optional的情况是将该类型作为方法或者构造函数的参数,这将导致不必要的代码复杂化. User user = new User("[email protected

Java 8 新特性:Java 类库的新特性之 Optional类 ——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  Java 类库的新特性之 Optional类 1.Optional简述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的

Java 8 (9) Optional取代null

NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的.很多年后,他对自己曾经做过的这个决定而后悔不已,把它称为"我价值百万的重大失误".它带来的后果就是---我们想判断一个对象中的某个字段进行检查,结果发现我们查看的不是一个对象,而是一个空指针,他会立即抛出NullPointerException异常. 看下面这个例子: pub