gpt4 book ai didi

java - 如何在 Java8 中过滤和映射 parallelStream 后收集结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:02 25 4
gpt4 key购买 nike

我想从另一个集合中提取一个对象集合。要过滤的对象必须是特定类型(或子类型)并且必须与给定的 Shape 相交.我想用 parallelStream 来做

我有以下代码:

public class ObjectDetector {
...
public ObjectDetector(final Collection<WorldObject> objects,
final BiFunction<Shape, Shape, Boolean> isIntersecting) {
...
}

public List<ISensor> getSonarObjects(final Shape triangle) {
return selectIntersecting(triangle, ISensor.class);
}

private <T> List<T> selectIntersecting(Shape triangle, Class<T> type) {
return objects.parallelStream()
.filter(o -> type.isInstance(o) && isIntersecting.apply(o.getShape(), triangle))
.map(o -> type.cast(o)).collect(Collectors.toList());

有问题的部分在List<T> selectIntersecting(Shape triangle, Class<T> type)方法,其中 objectsCollectionisIntersectingBiFunction<Shape,Shape,Boolean> .

当我使用 stream() 时而不是 parallelStream()我所有的测试都是绿色的。所以我可以假设过滤和映射逻辑工作正常。但是,当我尝试使用 parallelStream()我的测试出乎意料地失败了。我能够观察到的唯一连贯性是 size()返回的 List<T>小于或等于(但当然不会大于)我期望的大小。

例如一个失败的测试用例:

int counter = 0;
public BiFunction<Shape, Shape, Boolean> every2 = (a, b) -> {
counter++;
return counter % 2 == 0 ? true : false;
};

@Test
public void getEvery2Sonar() {
assertEquals("base list size must be 8",8,list.size());
ObjectDetector detector = new ObjectDetector(list, every2);
List<ISensor> sonarable = detector.getSonarObjects(triangle);
assertEquals("number of sonar detectables should be 3", 3, sonarable.size());
}

测试结果为:

Failed tests: getEvery2Sonar(hu.oe.nik.szfmv.environment.ObjectDetectorTest): number of sonar detectables should be 3 expected:<3> but was:<2>

在我的理解中-如其所写here - 可以收集 parallelStream进入非并发Collection .

我还尝试在并行教程中找到一些线索 page ,但我仍然一无所知。

有人可以解释一下我做错了什么吗?

最佳答案

您的谓词函数有副作用 - 这会严重影响 parallelStream因为输入流中的评估顺序是不确定的,而且您没有锁定可变状态。

确实, filter 的文档声明* 谓词必须是stateless .

我不确定您要在此处实现什么行为,因此我不确定合适的“修复”可能是什么。


* 无双关语意。

关于java - 如何在 Java8 中过滤和映射 parallelStream 后收集结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124223/

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