繁体   English   中英

类型不匹配无法从 Integer 转换为可选<integer></integer>

[英]type mismatch cannot convert from Integer to Optional<Integer>

我现在正试图理解流。 我想将 stream 中的最高数字保存为可选,但该程序只允许我将其保存为 Integer。 由于 stream 可能是空的,所以没有最高值,我希望能够将其保存为 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 提供输入。

get返回值本身,它解包Optional ,因此变量类型必须是Integer

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

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

不过有更好的方法

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)[从您的输入判断]并使用stream 上的终端操作(2)[意味着您以后不能像您尝试那样重用它]。

整个方法可以重写为

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM