Java 8——オプション

巴扎黑
巴扎黑オリジナル
2017-06-23 15:48:291667ブラウズ

この記事では主に Java 8的 Optional

@Data

@ AllArgsConstructor7
@NoArgsConstructor
public
class
Address {
プライベート文字列州;
private String city;
}
of + ofNullable 関連するコードは java8_demo でホストされています
1
2
3
4
5
6
8

9

1011
12
13
14
15
16
17
18
@Test(期待 = NoSuchElementException. class)
public
void
empty Test
() {
//空のOptionalオブジェクトを宣言します
Optional
nameOptional = Optional.empty();
// java.util.NoSuchElementException: 値が存在しません
nameOptional.get();
} @Test(expected = NullPointerException.class)
public
void ofNullTest () {
// インスタンス al オブジェクトに基づいてオプションを作成します
Optional.of(
new Address(
"Guangdong",
"Zhongshan"));
// Optional.ofNullable(null) は Optional.empty() を返しますassertEquals(Optional.empty(), Optional .ofNullable(null));
// java.lang.NullPointerException
オプション。 of(
null);}

map

  1. Stream.map 定義: <r> Stream<r> マップ(Function super T, ? extends R> マッパー) <p> <code>Stream.map的定义:<r> Stream<r> map(Function super T, ? extends R> mapper)</r></r>

  2. Optional.map的定义:<u> Optional<u> map(Function super T, ? extends U> mapper)</u></u>

  3. 上面两者定义非常类似,Optional可看成最多包含一个元素的 Stream

Java 8——オプション

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

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

  2. Optional.flatMap的定义:<u> Optional<u> flatMap(Function super T, Optional<u>> mapper)</u></u></u>

  3. Optional.map 定義: <u>map(Function super T, ? extends U> マッパー)</u>

Java 8——オプション

上記の 2 つのうち、Optional は、最大 1 つの要素を含む Stream と見なすことができます。11 flatMap
Java 8——オプション
1
2
3
4
5
6
7
8
9
10
@Test
公開マップテスト() {
String 省 = "Guangdong";
String city = "Zhongshan";
Optional
addressOptional = Optional.of(
new Address(province, city));
// マッパー :住所 -> 文字列
// オプション
オプション stringOptional = addressOptional.map(Address::getCity);
assertTrue() ) ;
assertEquals(city, stringOptional.get());
}
🎜🎜🎜Stream. flatMap 定義: <r> R> flatMap(Function super T, ? extends Stream extends R>> マッパー)</r>🎜🎜🎜🎜Optional. flatMap 定義: <u> ;U> flatMap(関数 super T、オプション<u>> マッパー)</u></u>🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜4🎜5 🎜🎜 6 🎜🎜7🎜🎜8🎜🎜9🎜🎜10🎜🎜11🎜🎜12🎜🎜🎜🎜🎜@Test🎜🎜🎜🎜🎜 ) {🎜🎜🎜🎜🎜🎜🎜文字列州 = 🎜 "Guangdong";🎜🎜🎜String city = 🎜"Zhongshan";🎜🎜🎜Optional
addressOptional = Optional.of(🎜new Address(province, city));🎜🎜🎜// マッパーの場合は T - > ; Optional、Optional.map が呼び出された場合、Optional>🎜🎜🎜Optional> = addressOptional.map(address -> Optional.ofNullable(address .getCity( )));🎜🎜🎜// マッパーが 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();
assertNotN ull(アドレス);
アドレス = null;
オプション emptyAddressOptional = Optional.ofNullable(address);
String defaultValue = "Unknown";
// orElse:设置默认值
Address elseAddress = emptyAddressOptional.orElse(新しいアドレス(デフォルト)値、デフォルト値) );
assertEquals(defaultValue, elseAddress.getProvince());
assertEquals(defaultValue, elseAddress.getCity());
// orElseGet:orElseの延迟用バージョン
ドレス elseGetAddress = emptyAddressOptional .orElseGet(Address::new);
assertNull(elseGetAddress.getProvince());
assertNull(elseGetAddress.getCity());
// ifPresent:存在する消費者、否か则不任意の操作を実行します
emptyAddressOptional.ifPresent(System.out::println);
// orElseThrow:不在時,抛出异常
emptyAddressOptional.orElseThrow(UnsupportedOperationException::new) );
}

フィルター

1
2
3
4
@Test
public void filterTest() {
assertTrue(addressOptional.filter(address -> address.getCity().contains("Z")).isPresent());
}

基础型 + Optional

  1. OptionalIntOptionalLongOptionalDoubleOptionalIntOptionalLongOptionalDouble

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

  3. 不支持 map 、 flatmap 、 filter

最大只有一元素、并没有像StreamInt 那样 Stream<integer></integer> に関連するパフォーマンスがあり、map flatmapfilter🎜🎜🎜

以上がJava 8——オプションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。