类型不匹配无法从Integer转换为Optional

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

我正在尝试了解流。我想将流中的最大数字另存为Optional,但是该程序仅允许我将其另存为Integer。由于流很可能为空,所以没有最高值,我希望能够将其另存为Optional。

到目前为止,我已经尝试过:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Optional;
import java.util.stream.Stream;

public class StreamsTest {

    public static void main(String[] args) {

        Collection<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        Stream<Integer> stream1 = list.stream().filter(x -> x % 2 == 1);
        if (stream1.findAny().isPresent() == true)
            System.out.println("Hey");
        Optional<Integer> opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();
    }

}

是因为.get()吗?我可以想象,当我使用它时,该程序有望获得价值。如果它没有得到一个值,那么它已经在此时崩溃,并且无需尝试将其保存到变量中。因此,它要么获取一个值并将其保存在Integer变量中,要么由于.get()无法为Optional传递输入而崩溃。

java java-8 java-stream max optional
1个回答
2
投票

get本身会返回值,它将解开Optional,因此变量类型必须为Integer

Integer opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();

请注意,没有getisPresent是不安全的,可能会导致异常。

不过有更好的方法

int max = list.stream()
        .filter(x -> x % 2 == 1)
        .mapToInt(Integer::valueOf)
        .max()
        .orElse(0); // or other value

此支票

if (stream1.findAny().isPresent() == true)
    System.out.println("Hey");

[这是不正确的,因为它永远都是正确的(1)[根据您的输入判断],并使用the terminal operation on the stream(2)[表示您以后无法像想要的那样重复使用它]]

整个方法可以重写为

IntStream
        .range(0, 10)
        .filter(x -> x % 2 == 1)
        .max()
        .orElseThrow(() -> new IllegalArgumentException("no max"));

请注意,我在这里使用了另一种技术。如果无法计算最大值(流中没有元素),我将抛出异常。

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