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

6 java arrays lambda java-8 java-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();
Run Code Online (Sandbox Code Playgroud)

但这给了我错误

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

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

这次我错过了什么?

Nam*_*man 10

那么,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
Run Code Online (Sandbox Code Playgroud)

相似

在上述解决方案中,迭代一维和二维阵列的语法保持相同.

区别

该解决方案,我会共享一维阵列利用Stream.of(T t)其中T被int[]输入所提供.另一方面,建议用于二维阵列的解决方案利用Stream.of(T... values)int[][]被认为是的地方int[]...,因此T评估int[]为最终创建一个Stream<int[]>.


Nic*_*s K 7

请改用flatMapToInt:

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