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

时间:2015-03-14 12:34:07

标签: java arrays lambda java-8

请考虑以下代码:

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

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

如果locales给我的尺寸,那么在<{strong>>应用ArrayList之后如何获得filter locales.size() 的尺寸?之前应用filter

2 个答案:

答案 0 :(得分:40)

从列表中获取流时,它不会修改列表。如果您想在过滤后获得流的大小,请在其上调用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中,或者只是在{{1}中收集过滤后的流的内容} {resp。List)使用ArrayList(resp。Collectors.toList())。

答案 1 :(得分:12)

使用count()方法:

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

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


仅供参考,它只能使用方法参考编码:

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