【问题标题】:type mismatch cannot convert from Integer to Optional<Integer>类型不匹配无法从 Integer 转换为 Optional<Integer>
【发布时间】:2020-04-30 11:09:36
【问题描述】:

我现在正在尝试理解流。 我想将流中的最高数字保存为可选,但程序只允许我将其保存为整数。由于流可能是空的,所以没有最高值,我希望能够将其保存为 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 并将其存储为 int (可能会崩溃)或不 get 并将其存储为可选项。
  • 只是一个注释: if (stream1.findAny().isPresent() == true) 可以重写为: if (stream1.findAny().isPresent() )

标签: java java-stream max optional


【解决方案1】:

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) [根据您的输入判断] 并使用 the terminal operation on the stream (2) [意味着您以后不能像尝试那样重用它]。

整个方法可以重写为

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

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

【讨论】:

  • 非常感谢。所以你推荐使用 IntStream 而不是流?像 IntStream 流 = new IntStream(); stream.range(0,10) 等?我为什么要使用范围?我可以只使用不带任何参数的 max() 吗?假设我的过滤器是 x -> x % 2 == 155。然后我的流在过滤后将为空。我的 findAny.isPresent 仍然是真的吗?
  • @Ikaros97 我刚刚用 IntStream 生成器替换了您的循环,以表明这是一种可能性。
  • @Ikaros97 Stream 和 IntStream 都有它们的应用程序。后者只是 Stream 的原始版本,带有一组相应的 int 方法
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多