gpt4 book ai didi

java - 根据 toMap 集合中的值过滤流

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:16 26 4
gpt4 key购买 nike

我的情况是 Player开发项目中的对象,任务只是测量距离并返回低于特定阈值的结果。当然,我想尽可能以最简洁的方式使用流。

目前,我有一个映射流的解决方案,然后通过迭代器进行过滤:

Stream<Player> str = /* source of my player stream I'm filtering */;
Map<Player, Double> dists = str.collect(Collectors.toMap(...)); //mapping function
Iterator<Map.Entry<Player, Double>> itr = map.entrySet().iterator();
while (itr.hasNext()) {
if (itr.next().getValue() <= radiusSquared) {
itr.remove();
}
}

但是,我想要实现的是在流被操作时执行此过滤的东西,它说“如果此谓词失败,则不收集”,以尝试并保存第二次迭代。此外,我不想计算两次距离,因此通过映射函数进行过滤,然后重新映射并不是一个合理的解决方案。

我想到的唯一真正可行的解决方案是映射到 Pair<A, B> ,但如果对某种形式的二进制流有 native 支持,那就更好了。

Java 的流 API 对此有原生支持吗?

最佳答案

之后过滤 Map 并不像看起来那么糟糕,请记住迭代 Map 并不意味着与执行查找相同的成本(例如散列).

但不是

Iterator<Map.Entry<Player, Double>> itr = map.entrySet().iterator();
while (itr.hasNext()) {
if (itr.next().getValue() <= radiusSquared) {
itr.remove();
}
}

你可以简单地使用

map.values().removeIf(value -> value <= radiusSquared);

即使您坚持将其作为 collect 操作的一部分,您也可以将其作为后缀操作:

Map<Player, Double> dists = str.collect(
Collectors.collectingAndThen(Collectors.toMap(p->p, p->calculate(p)),
map -> { map.values().removeIf(value -> value <= radiusSquared); return map; }));

首先避免放置不需要的条目是可能的,但这意味着手动追溯现有toMap收集器所做的事情:

Map<Player, Double> dists = str.collect(
HashMap::new,
(m, p) -> { double value=calculate(p); if(value > radiusSquared) m.put(p, value); },
Map::putAll);

关于java - 根据 toMap 集合中的值过滤流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253654/

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