このサンプルページに、それが書かれた当時、近々サポートされるであろうと想定されていた Java 7 closures を用いて書かれたものがある。
ただし、そのサンプルコード自体だいぶ古くて、今となっては文法も違っていたりするので、先日実際にリリースされた JDK8ではコンパイルできない。
というわけで、Java 8 を使ってちょっと書きなおしてみる。
まずオリジナルはこれ。
import fj.data.Array; import static fj.data.Array.array; import static fj.data.List.fromString; import static java.lang.Character.isLowerCase; public final class Array_exists { public static void main(final String[] args) { final Array<String> a = array("Hello", "There", "what", "DAY", "iS", "iT"); final boolean b = a.exists({String s => fromString(s).forall({char c => isLowerCase(c)})}); System.out.println(b); // true ("what" provides the only example; try removing it) } }で、書きなおしたやつがこれ。
import static java.lang.Character.isLowerCase; import java.util.stream.Stream; public final class Array_exists { public static void main(final String[] args) { final Stream<String> a = Stream.of("Hello", "There", "what", "DAY", "iS", "iT"); final boolean b = a.anyMatch(s -> s.chars().allMatch(n -> isLowerCase((char)n))); System.out.println(b); // true ("what" provides the only example; try removing it) } }ラムダ式の部分だけじゃなく、fj.data パッケージ以下の Array や List も、Java8 標準APIで置き換えた(というか、そうせざるを得なかった)。
なんか chars() が IntStream を返してくるのがちょっと嫌な感じだけど、ここで議論されている。
(あと Java 8と直接関係あるわけではないが、当然ながら Stream.of() は static インポートすべきじゃないだろう。Stream of A, B and C という名詞句にするために敢えて前置詞を用いているはずなので。)
ちなみに Java7 以前のバージョンはこれ。
import fj.F; import fj.data.Array; import static fj.data.Array.array; import static fj.data.List.fromString; import static fj.function.Characters.isLowerCase; public final class Array_exists { public static void main(final String[] args) { final Array<String> a = array("Hello", "There", "what", "DAY", "iS", "iT"); final boolean b = a.exists(new F<String, Boolean>() { public Boolean f(final String s) { return fromString(s).forall(isLowerCase); } }); System.out.println(b); // true ("what" provides the only example; try removing it) } }少なくともこのサンプルに限って言えば、だいぶマシになった感じだ。
0 件のコメント:
コメントを投稿