次のコードを検討してください。
List<Locale> locales = Arrays.asList(
new Locale("en", "US"),
new Locale("ar"),
new Locale("en", "GB")
);
locales.stream().filter(l -> l.getLanguage() == "en");
locales.size()
がlocales
を適用するサイズbeforeを与えるので、ArrayList
を適用するfilter
filter
afterのサイズを取得するにはどうすればよいですか?
リストからストリームを取得しても、リストは変更されません。フィルタリング後にストリームのサイズを取得する場合は、count()
を呼び出します。
long sizeAfterFilter =
locales.stream().filter(l -> l.getLanguage().equals("en")).count();
新しいリストを取得したい場合は、結果のストリームで.collect(toList())
を呼び出すだけです。リストの適切な変更を心配していない場合は、removeIf
でList
を使用できます。
locales.removeIf(l -> !l.getLanguage().equals("en"));
Arrays.asList
は固定サイズのリストを返すため、例外をスローしますが、ArrayList
でラップするか、単にフィルター処理されたストリームのコンテンツをList
(またはArrayList
)Collectors.toList()
(またはCollectors.toCollection(ArrayList::new)
)を使用します。
count()
メソッドを使用します。
_long matches = locales.stream()
.filter(l -> l.getLanguage() == "en")
.count();
_
_==
_を使用して文字列を比較していることに注意してください。 .equals()
を使用することをお勧めします。インターンされた文字列を比較する場合、_==
_は機能しますが、そうでない場合は失敗します。
参考までに、メソッド参照のみを使用してコーディングできます。
_long matches = locales.stream()
.map(Locale::getLanguage)
.filter("en"::equals)
.count();
_