我创建了一个数组,并尝试使用流来查找第一个奇数,如下所示:
int[] arr = new int[]{2, 4, 6, 8, 9, 12};
int oddOne = Stream.of(arr).filter(i -> i % 2 != 0).findFirst().get();
// fails above
Error: | incompatible types: int[] cannot be converted to int
我在做什么错?我该如何解决?
答案 0 :(得分:9)
您需要使用Arrays.stream()
:
Arrays.stream(arr).filter(i -> i % 2 != 0).findFirst().getAsInt();
哪个:
返回以指定数组为源的顺序
IntStream
。
到目前为止,您正在使用重载方法Stream.of(T t)
,该方法很简单:
返回包含单个元素的顺序
Stream
。
因此它只会是单个Stream
中的int[]
也正如nullpointer指出的那样,在不确保get()
中确实存在奇数的情况下调用Array
会导致错误。如果没有奇数,最好使用orElse()
返回默认值
答案 1 :(得分:4)
您正在尝试访问int[]
内部的int
,而不是filter
。解决该问题的一种方法是在flatMapToInt
的帮助下将IntStream
用作:
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
答案 2 :(得分:2)
您也可以使用IntStream
来流int[]
int[] arr = new int[]{2, 4, 6, 8, 9, 12};
int result = IntStream.of(arr).filter(i->i%2 !=0).findFirst().getAsInt();
System.out.println(result); //9
如果您没有任何奇数,则public int getAsInt()
会抛出NoSuchElementException.
如果此OptionalInt中存在值,则返回该值,否则抛出NoSuchElementException。
因此,@nullpointer
的建议始终建议使用orElse(int other)
public int orElse(其他int)
答案 3 :(得分:1)
变量很棘手。 Stream.of()
的签名为Stream.of(T ...arg)
。
其中T可以是任何类。但是,您正在传递不起作用的本机int
数组。相反,它认为整个数组是一个对象。
使用本机类型数组时会出现问题。
您的代码仅提供了int[]
类型的一个元素流。
您宁愿使用:
Integer[] arr = new Integer[]{2, 4, 6, 8, 9, 12};
您可以简单地使用它或按照其他人的建议使用Arrays.stream(arr)
。