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

Abd*_*UMI 30 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");
Run Code Online (Sandbox Code Playgroud)

我如何获得的大小locales ArrayList 申请filter的,因为locales.size()给我的尺寸申请filter

Ale*_* C. 44

从列表中获取流时,它不会修改列表.如果要在过滤后获取流的大小,请调用count()它.

long sizeAfterFilter = 
    locales.stream().filter(l -> l.getLanguage().equals("en")).count();
Run Code Online (Sandbox Code Playgroud)

如果要获取新列表,只需调用.collect(toList())生成的流即可.如果你不担心的地方修改列表,你可以简单地使用removeIfList.

locales.removeIf(l -> !l.getLanguage().equals("en"));
Run Code Online (Sandbox Code Playgroud)

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

  • @AbdennourTOUMI不要无条件地调用get(),你不知道流是否有元素!调用其中一种安全方法 - orElse,orElseThrow或ifPresent. (2认同)

Boh*_*ian 13

使用count()方法:

long matches  = locales.stream()
  .filter(l -> l.getLanguage() == "en")
  .count();
Run Code Online (Sandbox Code Playgroud)

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


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

long matches = locales.stream()
  .map(Locale::getLanguage)
  .filter("en"::equals)
  .count();
Run Code Online (Sandbox Code Playgroud)