java8 の OptionalとStreamに対する不満
java8でラムダ式がサポートされて、ある程度やり易くはなったのですが これだけは何とかしてほしかったというグチです。
使っていてすごく不便に感じます
Optional#ofNullable(value) メソッド名長い
Optional#of(value) は、value にnullを渡すと例外を吐くので、使いにくい。 結果、Optional#ofNullable を多用することになるのですが、なんとも長ったらしいメソッド名です。 Optional#of を、 Optional#ofUnnableNull とかにして、 Optional#ofNullable の機能を、 Optional#of としてくれればよかったのに。
いつも、以下の変な別名メソッドつくる羽目になります。
/** {@link Optional#ofNullable(T)} のシノニム */ public static <T> Optional<T> opt(T value){ return Optional.ofNullable(value); }
OptionalとStreamとに共通のインタフェースがない
Stream#flatMap に渡す関数の戻り値を Optional にできないのが非常に使いづらい。 共通のインタフェースを定義して受け取れるようにしてほしかったです。 せめて、Stream#flatMap をオーバーロードした
<R> Stream<R> flatMap(Function<? super T, ? extends Optional<? extends R>> mapper);
があるだけでももうちょっと使いやすかったのに。java8に定義されているのは、
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
だけ。
final List<Integer> intList = Arrays.asList(new Integer[] { 1, 2, 3, 4,5 }); //これはコンパイル通る。 System.out.println( intList.stream().flatMap(num -> Stream.of("'"+ num +"'")) .collect(Collectors.toList()) ); // ['1', '2', '3', '4', '5'] //これはコンパイルエラー。 //intList.stream().flatMap(num -> Optional.of("'"+ num +"'")); //こんな関数が存在していたとしても、利用できない final Function<Integer, Optional<String>> f = num -> Optional.of("'"+ num +"'"); //これはコンパイルエラー。 //intList.stream().flatMap(f); //こんな関数を作らないといけない。イヤダ。 final Function<Integer, Stream<String>> f2 = num -> Stream.of(f.apply(num).get()); System.out.println( intList.stream().flatMap(f2) .collect(Collectors.toList()) ); // ['1', '2', '3', '4', '5'] //Optional ==> Stream 変換するstaticユーティリティを作る羽目になる
- Stream インタフェースを実装して Either を作る と同じようなことをすれば、Optional よりましなものになるかも。 ただ、java8 の標準の Optional があるのに、わざわざ新しく作った Optional を使うほうが使いやすくなるのかという疑問はあります。