はじめに
久々に業務でJavaに触れたので、ついでにOptionalを復習した結果を記事としてまとめてみました。
サンプルコード1
ofNullable():「値がnullかもしれない時」に安全なOptionalオブジェクトを作る。
ifPresent():値が存在する場合のみ実行する。
map():(レシーバの)値が存在する場合にメソッド(※ここではString::toLowerCase())適用した結果を返す。
- 以下の
toLowerCaseNullable()では、「引数txtがnullでない(値が存在する)時だけString::toLowerCase()を呼び出す」というコードになっています。 - 呼び出し元では
ifPresent()を使って「戻り値が存在する時のみ標準出力する」というコードになっています。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
var opt1 = toLowerCaseNullable("aBcde");
var opt2 = toLowerCaseNullable(null);
// 値が存在する場合のみ実行
opt1.ifPresent(txt1 -> System.out.println(txt1)); // -> abcde
opt2.ifPresent(txt2 -> System.out.println(txt2)); // -> (出力無し)
}
/**
* 文字列に含まれる大文字をすべて小文字に変換する。
* @txt 小文字に変換する文字列。nullも許容される。
* @return 小文字に変換されたOptional<String>型の文字列。
*/
public static Optional<String> toLowerCaseNullable(String txt) {
return Optional.ofNullable(txt).map(String::toLowerCase);
}
}
サンプルコード2
orElse:(レシーバの)値がnullの時にデフォルト値を返す。
- 以下の
getEmployeeName()では、empMap.get(empId)がnullの時にorElse()に入ってデフォルト値である「該当者はいません」を返します。
import java.util.*;
public class Main {
// 従業員のIDと名前の対応表
private static final Map<Integer, String> empMap = Map.of(
1, "sato",
2, "tanaka",
3, "suzuki",
4, "takahashi",
5, "ito"
);
public static void main(String[] args) throws Exception {
var name1 = getEmployeeName(1);
var name2 = getEmployeeName(123);
System.out.println(name1);
System.out.println(name2);
}
/**
* 従業員のIDをキーにして、対応表から従業員名を取得して返す。
* @empId 従業員のID。
* @return 従業員名。従業員のIDに該当するレコードが無ければエラーメッセージを返す。
*/
public static String getEmployeeName(int empId) {
return Optional.ofNullable(empMap.get(empId)).orElse("該当者はいません");
}
}