yan's Handicraft

作成したフリーソフトを公開
Home » PC/システム開発 » java » java8 の OptionalとStreamに対する不満

java8 の OptionalとStreamに対する不満

4月 22nd, 2016 Posted in java, PC/システム開発 Tags: , ,

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 を使うほうが使いやすくなるのかという疑問はあります。

Leave a Reply

*