CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第8章 その他の Java 8 機能を理解する : 問題 5 : Stream vs Collection

問題

“第2章 ストリーム API の使い方” で、Listの中の長い単語を Stream を使って数えた。

List<String> words = ~;
long count =
    words.stream()
    .filter(w -> w.length > 12)
    .count();

ラムダ式は用いるが Stream を使用しないで同じことを行え。

解答

java.util.Collectionインターフェースの default メソッドremoveIfを使用する。

List<String> words = ~;
words.removeIf(w -> w.length() <= 12);
long count = words.size();

ただしListIteratorremoveメソッドをサポートしている必要がある。
例えば

Arrays.asList(String ...)

の戻り値のListは駄目で、ArrayListLinkedListを使う。

さらに問題

サイズの大きいListでは、どちらの方が高速か?

解答

第2章で用いた “不思議の国のアリス” と “戦争と平和” で計測する。
Listの具象クラスは、ArrayListを使う(LinkedListより若干速かった)。

単語数 Stream 使用時 removeIf 使用時
不思議の国のアリス 30,420 3.47 msec 2.82 msec
戦争と平和 575,343 7.72 msec 9.34 msec

サイズの大きいListでは、Stream を使った方が高速である。