如何在通过 lambda 表达式应用过滤器后获取 Stream 的大小?

How to get the size of a Stream after applying a filter by lambda expression?

考虑以下代码:

List<Locale> locales = Arrays.asList(
    new Locale("en", "US"),
    new Locale("ar"),
    new Locale("en", "GB")
); 

locales.stream().filter(l -> l.getLanguage() == "en");

我如何获得 locales ArrayList 应用 filter 后的大小,因为 locales.size() 给了我尺寸 before 应用 filter?

当您从列表中获取流时,它不会修改列表。如果你想得到过滤后流的大小,你调用count()就可以了。

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

如果您想获取新列表,只需对结果流调用 .collect(toList())。如果您不担心就地修改列表,您可以简单地在 List.

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

请注意,Arrays.asList returns 是一个固定大小的列表,因此它会抛出异常,但您可以将其包装在 ArrayList 中,或者简单地收集过滤后的内容使用 Collectors.toList()(resp. Collectors.toCollection(ArrayList::new))在 List(resp. ArrayList)中流式传输。

使用count()方法:

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

请注意,您正在使用 == 比较字符串。更喜欢使用 .equals()。虽然 == 在比较 interned 字符串时会起作用,否则它会失败。


仅供参考,它可以仅使用方法引用进行编码:

long matches = locales.stream()
  .map(Locale::getLanguage)
  .filter("en"::equals)
  .count();