Java OptionalでNULLに対応するサンプル

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]

関連の記事

Java if文 条件分岐を行うサンプル

△上に戻る