在下面的代码中,在HashSet的每个元素上调用一个本地方法。如果返回一个特殊值,我们停止循环。否则,我们将每个返回值添加到新的HashSet中。

HashSet<Object> myHashSet=…;
HashSet<Object> mySecondHashSet=…;

for (Object s : myHashSet) {
    Object value = my_method(s);
    if(value==specialValue)
        return value;
    else
        mySecondHashSet.add(value);
 }


我想将这个过程并行化。 HashSet中的所有对象都没有任何共同的对象(它是树状结构),因此我知道它们可以运行而没有任何同步问题。如何修改代码,使my_method(s)的每次调用开始一个新的过渡,并且如果一个线程的求值结果为特殊值,则所有线程都将暂停而不返回,而返回特殊值?

最佳答案

考虑到Java 8,这可能相对简单,但它不会保留您的初始代码语义:

万一您需要击中返回特殊值

if (myHashSet.parallelStream()
             .map(x -> method(x))
             .anyMatch(x -> x == specialValue)) {

    return specialValue;
}


如果您需要保持转换后的值直到满足特殊值,您已经从@Elliot的注释中得到了答案,同时需要提及的是语义与您的原始代码不同,因为将不保留任何定序符。



尽管尚待检查,但我希望可以优化以下内容,并在达到所需的特殊值时停止:

if (myHashSet.parallelStream()
             .anyMatch(x -> method(x) == specialValue)) {

    return specialValue;
}

10-04 16:13