みなさん、こんにちは。品質管理部の平良です。
SE8で使えるテクニックをよく見かける日でした。EE7の中でも当然有用なもので、あるセッションの中では「SE8で現在のEE7を向上させることができる」と語っていました。
SE8で追加された主な機能は次の通りです。
・ラムダ
・ストリーム
・Date&TimeAPI
・Optional
・コレクションの強化
・その他(StringJoiner, CompletableFuture, Comparator, RepeatableAnnotations)
一つ例を見てみましょう。
public class Sample { public static void main(String[] args) { List names = Arrays.asList("Tom", "Jerry", "Jone", "Jack"); // 標準出力に各名前を全部大文字にしてカンマで繋げて出力したい } }
SE7まではこうでした。
public class Sample { public static void main(String[] args) { List names = Arrays.asList("Tom", "Jerry", "Jone", "Jack"); for(String name: names) { System.out.print(name.toUpperCase() + ", "); // OK? } } }
実はこれは正解ではありません。”TOM, JERRY, JONE, JACK, “と末尾に余計な文字が付いたままになります。
public class Sample { public static void main(String[] args) { List names = Arrays.asList("Tom", "Jerry", "Jone", "Jack"); for (int i = 0; i < names.size(); i++) { System.out.print(names.get(i).toUpperCase()); if (i != names.size() - 1) { System.out.print(", "); } } } }
「こう書くのはあんまりすぎる!」とスピーカーの方もコードを書いている途中で投げていました。
たしかにこれだと処理のわりにコードが複雑になりすぎです。これがSE8になると。
public class Sample { public static void main(String[] args) { List names = Arrays.asList("Tom", "Jerry", "Jone", "Jack"); System.out.println( names.stream() .map(String::toUpperCase) .collect(Collectors.joining(", "))); } }
だいぶシンプルになりました。ちなみに大文字にする条件がなければストリームを使用する必要もなく、System.out.print(String.join(“, “, names)); だけで事足ります。
このようにSE8になることで繰り返し処理やコレクションに対する処理が格段に扱いやすくなりました。またストリームは並列処理をさせることもできるので効率向上も見込めます。ただしEEで並列ストリームを使用するのは注意が必要だそうです。
並列ストリームは共通のForkJoinPoolを使用しており、これらのスレッドはEE環境外になるものです。 そしてForkJoinPoolは利用可能な全てのCPUコアを使用するため、使用にはリスクが伴うとのことでした。
今後EEサーバで、正しく並列ストリームを設定できる可能性もあるそうなので注目です。