JavaのOptionalでNULLに対応するサンプルです。
目次
サンプル | Optionalクラス |
Optionalの値をフィルタする(filter) | |
Optionalの値を処理して返す(map) | |
mapメソッドとflatMapメソッドの違い |
Optionalクラス
public final class Optional<T> extends Object |
- 値がNULLの可能性があることを明示します。
- 値がNULLの場合に、値をセットするメソッド等があります。
- Java8で導入されました。
- 以下は、OracleのJava8 API仕様のOptionalのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html
Optionalクラスのサンプルです。
package test1;
import java.util.Optional;
public class Test1 {
public static void main(String[] args) {
Optional<String> a = getName1();
String b = a.orElse("moji2");
System.out.println(b); //moji2
a.ifPresent(x -> System.out.println(x));//nullではない場合は表示
}
static Optional<String> getName1() {
String a = null;
//String a = "moji";
return Optional.ofNullable(a);
}
}
6行目は、11行目のメソッドを呼んでいます。
14行目は、Optionalとして値を戻します。
ofNullableメソッドは、値があるOptionalまたは空のOptionalを返します。
呼び出し元にOptionalの記述を強制させ、NullPointerExceptionが発生しないようにします。
7行目のorElseメソッドは、値が存在しないとき引数の値を返します。
8行目は、moji2と表示されます。
12行目をコメントにし、13行目のコメントを外すと8行目はmojiと表示されます。
9行目のifPresentは、値がnullでない場合に実行されます。
Optionalの値をフィルタする(filter)
public Optional<T> filter(Predicate<? super T> predicate) |
filterメソッドは、Optionalの値をフィルタできます。
package test1;
import java.util.Optional;
public class Test1 {
public static void main(String[] args) {
Optional<String> str1 = getName1();
str1
.filter(x -> x.length() >3)
.ifPresent(System.out::println);//moji
System.out.println(str1); //Optional[moji]
}
static Optional<String> getName1() {
String a = "moji";
return Optional.ofNullable(a);
}
}
8行目は、文字の長さが3文字より大きい場合に一致します。
9行目は、文字列mojiが表示されます。
8行目の数値を3より大きい値にすると9行目は何も表示されません。
9行目の(System.out::println)はメソッド参照です。
(x -> {System.out.println(x);})と同じ意味です。
Optionalの値を処理して返す(map)
public <U> Optional<U> map(Function<? super T,? extends U> mapper) |
mapメソッドでOptionalの値を処理して返すサンプルです。
package test1;
import java.util.Optional;
public class Test1 {
public static void main(String[] args) {
Optional<String> str1 = getName1();
str1
.map(x -> x.toUpperCase())
.ifPresent(System.out::println); //MOJI
System.out.println(str1); //Optional[moji]
}
static Optional<String> getName1() {
String a = "moji";
return Optional.ofNullable(a);
}
}
8行目は、文字を大文字に変換しています。
9行目は、大文字でMOJIが表示されます。
9行目の(System.out::println)はメソッド参照です。
(x -> {System.out.println(x);})と同じ意味です。
mapメソッドとflatMapメソッドの違い
public <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) |
mapメソッドとflatMapメソッドの違いのサンプルです。
package test1;
import java.util.Optional;
public class Test1 {
public static void main(String[] args) {
// mapメソッド
Optional<Object> a = getName1("1").map(x ->getName1(x));
System.out.println(a); //Optional[Optional[1]]
// flatMapメソッド
Optional<String> b = getName1("1").flatMap(x ->getName1(x));
System.out.println(b); //Optional[1]
}
static Optional<String> getName1(String a) {
return Optional.ofNullable(a);
}
}
7行目は、mapメソッドを使用し、getName1メソッドを2回実行しています。l
15行目の戻り値はOptional型です。
8行目は、Optionalの中にOptionalがある形になります。Optional[Optional[1]]。
11行目は、flatMapメソッドを使用し、getName1メソッドを2回実行しています。
15行目の戻り値はOptional型です。
12行目は、Optionalは1つだけの形になります。Optional[1]。
関連の記事