使用流来查找列表列表中的对象

Pau*_*ton 6 java java-8 java-stream

我正在尝试编写一个方法,在列表列表中查找对象的索引并利用并行性.这是我的代码.

// returns [i, j] where lists.get(i).get(j) equals o, or null if o is not present.
public static int[] indices(List<? extends List<?>> lists, Object o) {
    return IntStream.range(0, lists.size())
                    .boxed()
                    .flatMap(i -> IntStream.range(0, lists.get(i).size()).mapToObj(j -> new int[]{i, j}))
                    .parallel()
                    .filter(a -> {
                        System.out.println(Arrays.toString(a));     // For testing only
                        return Objects.equals(o, lists.get(a[0]).get(a[1]));
                    })
                    .findAny()
                    .orElse(null);
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下代码时

List<List<String>> lists = Arrays.asList(
        Arrays.asList("A", "B", "C"),
        Arrays.asList("D", "E", "F", "G"),
        Arrays.asList("H", "I"),
        Collections.nCopies(5, "J")
);
System.out.println("Indices are " + Arrays.toString(indices(lists, "J")));
Run Code Online (Sandbox Code Playgroud)

输出是这样的

[0, 0]
[0, 1]
[0, 2]
[3, 0]
[3, 1]
[3, 2]
[3, 3]
[2, 0]
[3, 4]
[1, 0]
[1, 1]
[2, 1]
[1, 2]
[1, 3]
Indices are [3, 0]
Run Code Online (Sandbox Code Playgroud)

换句话说,即使在找到对象之后搜索仍继续.不findAny应该是短路操作吗?我错过了什么?此外,在迭代列表列表或锯齿状数组时,利用并行性的最佳方法是什么?

编辑

根据@ Sotirios的回答,我得到了一个输出

Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 0]
Thread[main,5,main] [2, 0]
Thread[main,5,main] [2, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 0]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 2]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 3]
Thread[main,5,main] [0, 0]
Thread[main,5,main] [0, 1]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 1]
Thread[main,5,main] [0, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 3]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 4]
Indices are [3, 0]
Run Code Online (Sandbox Code Playgroud)

请注意

Thread[ForkJoinPool.commonPool-worker-3,5,main]
Run Code Online (Sandbox Code Playgroud)

在找到答案后继续搜索.

Mis*_*sha 7

短路操作不能保证仅产生与产生结果所需的元素一样少的元素.他们可能会这样做,但不是必需的.

当前的实现flatMap是这样的,它总是将子流的整个内容推向下游.因此,即使您的流不是并行的,您也可以看到更多元素流过流而不是满足findAny.