makotan _at_ gmail dot com

Java8のStreamとFunctionalInterface

ぼけーっとtwitterみてたら見つけたので、日曜日の昼下がりにぼけーっと書いてみる
http://d.hatena.ne.jp/cero-t/20151212/1449929908

Java8といえば・・・

Streamが標準になってFunctionalInterfaceが使える様になった!ってのがかなり大きなトピック(他にも色々あるけど)
ただ、欠点としては末尾最適化は相変わらず無いので普通に再帰しようとするとちゃんとスタックオーバーフローするので再帰テクニックが使えない
さらに、パターンマッチも相変わらず無いのでパターンマッチでゴニョゴニョするっていうテクニックもやっぱり使えない
ついでに、成功・失敗を表すクラスも標準には無いからそっちも使えない
それは一体、何かというと表面的には扱いやすいんだけど変な言語になってるって事
まぁ本気でそっち系が欲しければ別の言語使えって言われて終わりだけどねw

なにを思ったか

まず、ソースコードの終わりがstream.forEach(System.out::println);になってること
ということは最終的には全件処理させたい=streamである必要が無い可能性が非常に高い
あとあのソースコードでは途中でエラーになったときにどうするのかの定義が上手に出来ない
まさか、throw new UncheckedIOException(e);これして終わりなんて事は無いよなぁ・・・
よくあるパターンと言えば、失敗情報を纏めて呼び出し元に返して呼び出し元がよろしくやるって事も出来ない
Stream実験コードとしては十分良いけど、運用のコードとしてはどうなんでしょ〜
まぁ、アドベントカレンダーなんてそんなもんだよなぁ〜まぁ良いかなぁ〜

じゃ、どうするの?

普通にFunctionalInterfaceを作って、それを持ってるオブジェクトを組み立てて構築した方がgzipのときどうするの??とか、XXXXから取得するときどうするの?みたいなのには対応しやすい気がした
で、エラーが起きたらその情報を呼び出し元に返せるようなクラスを定義するかTuple返す
そしたら実行後に一定回数の再試行でも再試行用に組み合わせを変えた奴を動かせばOKなはず
サンプルコード書かないと伝わる気がしないけど、最後は自分用のメモだから気にしないw
あと、Javaにパターンマッチと末尾最適化とヒアドキュメント欲しい。
モジュール化とかどうでも良いからw