web-dev-qa-db-ja.com

ラムダ式によるフィルターを適用した後にストリームのサイズを取得する方法は?

次のコードを検討してください。

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を適用するfilterfilterafterのサイズを取得するにはどうすればよいですか?

29
Abdennour TOUMI

リストからストリームを取得しても、リストは変更されません。フィルタリング後にストリームのサイズを取得する場合は、count()を呼び出します。

long sizeAfterFilter = 
    locales.stream().filter(l -> l.getLanguage().equals("en")).count();

新しいリストを取得したい場合は、結果のストリームで.collect(toList())を呼び出すだけです。リストの適切な変更を心配していない場合は、removeIfListを使用できます。

locales.removeIf(l -> !l.getLanguage().equals("en"));

Arrays.asListは固定サイズのリストを返すため、例外をスローしますが、ArrayListでラップするか、単にフィルター処理されたストリームのコンテンツをList(またはArrayListCollectors.toList()(またはCollectors.toCollection(ArrayList::new))を使用します。

43
Alexis C.

count()メソッドを使用します。

_long matches  = locales.stream()
  .filter(l -> l.getLanguage() == "en")
  .count();
_

_==_を使用して文字列を比較していることに注意してください。 .equals()を使用することをお勧めします。インターンされた文字列を比較する場合、_==_は機能しますが、そうでない場合は失敗します。


参考までに、メソッド参照のみを使用してコーディングできます。

_long matches = locales.stream()
  .map(Locale::getLanguage)
  .filter("en"::equals)
  .count();
_
13
Bohemian