如何在通过 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();
考虑以下代码:
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();