Java 8——Optional

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

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

    Stream.map的定义:<R> Stream<R> map(Function<? super T, ? extends R> mapper)

    Optional.map的定义:<U> Optional<U> map(Function<? super T, ? extends U> 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<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

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

    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

    OptionalIntOptionalLongOptionalDouble

    最多只有一个元素,并没有像StreamInt那样相对于 Stream<Integer> 有性能优势

    不支持 mapflatmapfilter

以上就是Java 8——Optional的详细内容,更多请关注其它相关文章!

在乎的应该是沿途的风景以及看风景的心情。

Java 8——Optional

相关文章:

你感兴趣的文章:

标签云: