使用 Stream 从二维整数数组中查找奇数



我正在尝试如下代码

int[][] mat = new int[][]{new int[]{2,4,6}, new int[]{8,9,12}};
int oddInAll = Arrays.stream(mat).filter(i -> i%2 != 0).findFirst().getAsInt();

但这给了我错误

| 错误: | 二进制运算符 '%' 的错误操作数类型 | 第一 类型: int[] | 第二种类型:int | int oddInAll = Arrays.stream(mat).filter(i -> i%2 != 0).findFirst().getAsInt(); |
^---^

| 错误: | 找不到符号 | 符号: 方法 getAsInt() |
int oddInAll = Arrays.stream(mat).filter(i -> i%2 != 0).findFirst().getAsInt(); |
^-------------------------------------------------------------^

这次我错过了什么?

好吧,在这种情况下,Arrays.Stream会导致您的i属于int[]类型,不能在filter中使用。

我建议使用我之前在此操作中分享的类似示例。

int oddOrMin = Stream.of(arr) // Stream<int[]> and not integers
                     .flatMapToInt(Arrays::stream) // IntStream
                     .filter(i -> i % 2 != 0)
                     .findFirst() // OptionalInt
                     .orElse(Integer.MIN_VALUE); //default to some value

相似

上述解决方案中,迭代一维数组和二维数组的语法保持不变。

差异

我为一维数组共享的解决方案利用了输入中提供的 T int[] Stream.of(T t)。另一方面,为二维数组建议的解决方案利用了Stream.of(T... values),其中int[][]再次被认为是int[]...的,因此T计算int[]以最终创建一个Stream<int[]>

改用 flatMapToInt :

int oddInAll = Arrays.stream(mat).flatMapToInt(Arrays::stream)
                     .filter(i -> (i % 2 != 0)).findFirst().getAsInt();

最新更新