相关疑难解决方法(0)

收集器的组合器功能是否可以用于顺序流?

示例程序:

public final class CollectorTest
{
    private CollectorTest()
    {
    }

    private static <T> BinaryOperator<T> nope()
    {
        return (t, u) -> { throw new UnsupportedOperationException("nope"); };
    }

    public static void main(final String... args)
    {
        final Collector<Integer, ?, List<Integer>> c
            = Collector.of(ArrayList::new, List::add, nope());

        IntStream.range(0, 10_000_000).boxed().collect(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,为了简化这里的问题,没有最终的转换,因此生成的代码非常简单.

现在,IntStream.range()生成一个顺序流.我只是将结果打成Integers然后我的设计Collector将它们收集到一个List<Integer>.很简单.

无论我运行多少次这个示例程序,UnsupportedOperationException从不命中,这意味着我的虚拟组合器永远不会被调用.

我有点期待这个,但后来我已经误解了流,我不得不问这个问题......

可以在Collector当流的组合曾经被称为保证是连续的?

java java-8 java-stream

31
推荐指数
1
解决办法
3201
查看次数

Java 8中的顺序流是否在调用collect时使用了combiner参数?

如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编器参数来收集吗?我猜不是,但我在文档中看不到任何内容.如果我是正确的,那么不得不提供我知道不会被使用的东西(如果我知道它是顺序流)似乎是不幸的.

java java-8 java-stream

27
推荐指数
1
解决办法
3658
查看次数

Stream reduce()要求究竟需要什么?

reduce()在并行流上使用该操作时,OCP考试书指出reduce()参数必须遵守某些原则.这些论点如下:

  1. 必须定义标识,使得对于流u中的所有元素,combiner.apply(identity,u)等于u.
  2. 累加器运算符op必须是关联的和无状态的,(a op b) op c等于a op (b op c).
  3. 组合器运算符还必须是关联的和无状态的并且与标识兼容,以便对于所有ut combiner.apply(u, accumulator.apply(identity, t))等于accumulator.apply(u,t).

考试书提供了两个例子来说明这些原则,请参阅下面的代码:

关联的示例:

System.out.println(Arrays,asList(1,2,3,4,5,6))
.parallelStream()
.reduce(0,(a,b) -> (a-b))); //NOT AN ASSOCIATIVE ACCUMULATOR
Run Code Online (Sandbox Code Playgroud)

OCP书中对此有何说法:

它可能会输出-21,3或其他一些值,因为累加器函数违反了associativity属性.

身份要求的示例:

System.out.println(Arrays.asList("w","o","l","f"))
.parallelStream()
.reduce("X", String::concat));
Run Code Online (Sandbox Code Playgroud)

OCP书中对此有何说法:

如果我们使用的身份参数不是真正的身份值,您可以看到其他问题.它可以输出XwXoXlXf.作为并行过程的一部分,标识将应用于流中的多个元素,从而导致非常意外的数据.

我不明白这些例子.使用累加器示例,累加器以0 -1 = -1然后-1 -2开始,其中= -3然后-6等等一直到-21.我明白,因为生成的arraylist不同步,结果可能是不可预测的,因为竞争条件等的可能性,但为什么累加器不关联?Woulden也不会(a+b)导致不可预测的结果?我真的没有看到示例中使用的累加器有什么问题,以及为什么它不是关联的,但是我仍然不能完全理解关联原则是什么.

我也不了解身份的例子.据我所知,如果4个独立的线程同时开始与身份一起累积,那么结果确实可能是XwXoXlXf,但这与身份参数本身有什么关系呢?究竟什么是适当的身份才能使用呢?

我想知道是否有人可以更多地了解这些原则.

谢谢

java parallel-processing reduce java-8 java-stream

8
推荐指数
3
解决办法
747
查看次数

标签 统计

java ×3

java-8 ×3

java-stream ×3

parallel-processing ×1

reduce ×1