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