gpt4 book ai didi

java - 通过分组、计数和过滤操作收集流

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:22 30 4
gpt4 key购买 nike

我正在尝试收集流中丢弃的很少使用的元素,如本例所示:

import java.util.*;
import java.util.function.Function;
import static java.util.stream.Collectors.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import org.junit.Test;

@Test
public void shouldFilterCommonlyUsedWords() {
// given
List<String> allWords = Arrays.asList(
"call", "feel", "call", "very", "call", "very", "feel", "very", "any");

// when
Set<String> commonlyUsed = allWords.stream()
.collect(groupingBy(Function.identity(), counting()))
.entrySet().stream().filter(e -> e.getValue() > 2)
.map(Map.Entry::getKey).collect(toSet());

// then
assertThat(commonlyUsed, containsInAnyOrder("call", "very"));
}

我觉得可以做得更简单 - 对吗?

最佳答案

没有办法绕过创建 Map ,除非您想接受非常高的 CPU 复杂度。

但是,您可以删除第二个 collect操作:

Map<String,Long> map = allWords.stream()
.collect(groupingBy(Function.identity(), HashMap::new, counting()));
map.values().removeIf(l -> l<=2);
Set<String> commonlyUsed=map.keySet();

请注意,在 Java 8 中,HashSet仍然包装 HashMap , 所以使用 keySet()HashMap , 当你想要 Set首先,考虑到当前的实现,不会浪费空间。

当然,你可以把后处理隐藏在Collector中如果感觉更“流畅”:

Set<String> commonlyUsed = allWords.stream()
.collect(collectingAndThen(
groupingBy(Function.identity(), HashMap::new, counting()),
map-> { map.values().removeIf(l -> l<=2); return map.keySet(); }));

关于java - 通过分组、计数和过滤操作收集流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515792/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com