使用Stream从int []数组中查找奇数

时间:2018-12-24 03:51:42

标签: java java-stream

我创建了一个数组,并尝试使用流来查找第一个奇数,如下所示:

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

我在做什么错?我该如何解决?

4 个答案:

答案 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)