如何在Java 8中从三维数组中获取流?

5

我知道如何从二维数组中获取流,但我想知道如何从下面的三维数组中获取流?

 int[][][] data = {
                    {
                        {1, 2, 3},
                        {4, 5, 6},
                        {7, 8, 9}
                    },
                    {
                        {1, 2, 3},
                        {4, 5, 6},
                        {7, 8, 9}
                    }
                  };

一个什么样的流?如果你知道如何处理二维数组,难道不能将解决方案外推到三维吗? - JB Nizet
2
我想获取IntStream。对于二维数组,解决方案如下:IntStream is = Arrays.stream(data).flatMapToInt(row -> Arrays.stream(row));作为Java 8的初学者,我无法将此解决方案推广到三维。 - hitesh.incept
2个回答

8
如果可以使用二维数组完成它,那么对于 N 维数组来说并不是那么困难。
解决方案可按以下方式进行:
IntStream result = Arrays.stream(data)
                         .flatMap(Arrays::stream)
                         .flatMapToInt(Arrays::stream);

为了更好地理解上面发生了什么,您可以将方法调用分成以下几部分:
// the call to Arrays.stream yields a Stream<int[][]>
Stream<int[][]> result1 = Arrays.stream(data); 

// the call to flatMap yields a Stream<int[]>
Stream<int[]> result2 = result1.flatMap(Arrays::stream);

  // the call to flatMapToInt yields a IntStream
IntStream intStream = result2.flatMapToInt(Arrays::stream);

感谢您的解释,@Aominè。 - hitesh.incept
1
嗨,我有两个问题,你能帮忙吗?(Q1)为什么我们使用flatMapToInt而不是只使用flatMap?没有指定我们需要int流的要求。(Q2)我想出了一个解决方案,但它不起作用,但我不明白为什么。我猜这可能与Q1有关。Arrays.stream(data).flatMap(x -> Arrays.stream(x)).flatMap(y -> Arrays.stream(y)).collect(Collectors.toList()); - CuriousCurie

5

您只需要再次调用flatMap,将流从int[][]更改为int[]的流。

IntStream stream = Arrays.stream(data)
                         .flatMap(twoDArray -> Arrays.stream(twoDArray))
                         .flatMapToInt(oneDArray -> Arrays.stream(oneDArray));

1
感谢 @YassinHajaj - hitesh.incept

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接