第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();
ただしList
のIterator
がremove
メソッドをサポートしている必要がある。
例えば
Arrays.asList(String ...)
の戻り値のList
は駄目で、ArrayList
かLinkedList
を使う。
さらに問題
サイズの大きい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 を使った方が高速である。