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