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

4

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

int[] arr = new int[]{2, 4, 6, 8, 9, 12};
int oddOne = Stream.of(arr).filter(i -> i % 2 != 0).findFirst().get();
                                   // fails above

错误: | 不兼容的类型: 无法将int[]转换为int

我做错了什么?我该如何修复它?

5个回答

13

您需要使用 Arrays.stream()

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

Which:

返回以指定数组为源的顺序IntStream

目前您正在使用重载方法Stream.of(T t),它只是简单地:

返回包含单个元素的顺序Stream

因此它只是一个由单个int[]组成的Stream


另外,正如nullpointer所指出的,如果没有确保在Array中实际存在奇数,则调用get()将导致错误。最好使用orElse()来返回默认值,如果没有奇数则返回该值。


4
你正在尝试访问你的过滤器(filter)中的 int 而不是 int[]。解决这个问题的一种方法是使用 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

1
最好直接从Arrays.stream(arr)开始,没有必要创建一个Stream<int[]>(只有一个单一元素),然后再创建一个IntStream - undefined

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

可变参数很棘手。 Stream.of() 的签名是 Stream.of(T ...arg),其中 T 可以是任何类。但是您正在传递一个原生 int 数组,这不起作用。相反,它认为整个数组是一个对象。 当您使用原生类型的数组时会出现问题。 您的代码提供了一个类型为 int[] 的单一元素流。 您可以改为使用:

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

你可以简单地使用这个方法或者像其他人建议的那样使用 Arrays.stream(arr)

0
public class 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);
    }
//This can be used to sum odd numbers
public class 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);
    }
//This can be used to sum even numbers

1
那怎么回答“找到第一个奇数”这个问题呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接