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

问题描述 投票:0回答:5

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

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

我做错了什么?我该如何解决这个问题?

java java-stream
5个回答
13
投票

您需要使用

Arrays.stream()
:

Arrays.stream(arr).filter(i -> i % 2 != 0).findFirst().getAsInt();

其中:

返回一个连续的

IntStream
,以指定数组作为其源。

到目前为止,您正在使用重载方法

Stream.of(T t)
,它简单地:

返回包含单个元素的连续

Stream

所以它只是单个

Stream
int[]


正如空指针所指出的,在不确保

get()
中实际上存在奇数的情况下调用
Array
将导致错误。如果不存在奇数,最好使用
orElse()
返回默认值


4
投票

您正在尝试访问

int[]
,而不是
int
内的
filter
eger。解决这个问题的一种方法是在
IntStream
 的帮助下使用 
flatMapToInt
,如下所示:

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
投票

您也可以使用

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 other)


1
投票

Varargs 很棘手。

Stream.of()
的签名是
Stream.of(T ...arg)
。 其中 T 可以是任何类。但是您传递的原生
int
数组不起作用。相反,它认为整个数组是一个对象。 当您使用本机类型数组时就会出现问题。 您的代码给出了仅包含一个
int[]
类型元素的流。 你更可以使用:

Integer[] arr = new Integer[]{2, 4, 6, 8, 9, 12};

您可以简单地使用它或按照其他人的建议使用

Arrays.stream(arr)


0
投票

公共类 EvenNumberSum {

public static int sumEvenNumbers(int[] array) {
    return Arrays.stream(array)
                 .filter(num -> num % 2 == 0)
                 .sum();
}

public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int result = sumEvenNumbers(numbers);
    System.out.println("Sum of even numbers: " + result);
}

//这个可以用来求奇数之和 公共类 EvenNumberSum {

public static int sumEvenNumbers(int[] array) {
    return Arrays.stream(array)
                 .filter(num -> num % 2 != 0)
                 .sum();
}

public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int result = sumEvenNumbers(numbers);
    System.out.println("Sum of even numbers: " + result);
}

//这个可以用来求偶数之和

© www.soinside.com 2019 - 2024. All rights reserved.