【问题标题】:How to convert Optional<Integer> to OptionalInt如何将 Optional<Integer> 转换为 OptionalInt
【发布时间】:2020-09-29 04:37:31
【问题描述】:

我有一个可选的变量:

//es is an arraylist, rock is a class in the arraylist
var as = IntStream.range(0,es.size()).boxed()
         .filter(i->es.get(i) instanceof Rock)
         .max((l1,l2) -> comparator(es,(Rock)es.get(l1),(Rock)es.get(l2)));

在这种情况下,我想为我的方法返回一个 OptionalInt:

      if (as.isPresent()) {return Optionalint.of(as);} //Obviously it is not working
      return OptionalInt.empty();

在这种情况下,如何将 Optional 转换为 OptionalInt? 顺便说一句,我发现这个问题How to convert an Optional to an OptionalInt? 在我喜欢的情况下并不是很有帮助:

Stream.of(as).filter(s -> s != null && s.matches("\\d+"))
            .mapToInt(Integer::parseInt).findAny();

它会给我一个错误:方法 match(String) 未定义 Optional 类型 有什么办法解决这个问题吗?谢谢!

【问题讨论】:

  • 请解释清楚为什么链接的帖子没有帮助。展示您如何使用链接的帖子以及它如何无法解决您的问题。
  • 您是否尝试过return as;,而不是return OptionalInt.of(as);,因为as已经OptionalInt

标签: java java-stream optional


【解决方案1】:

使用Optional::map 将值映射到Optional&lt;OptionalInt&gt;,然后使用Optional::orElse 返回它或一个空的OptionalInt.empty()。我假设comparator 方法可以正常工作:

OptionalInt as = IntStream.range(0, es.size()).boxed()
            .filter(i-> es.get(i) instanceof Rock)
            .max((l1, l2) -> comparator(es, (Rock)es.get(l1), (Rock)es.get(l2)))
            .map(OptionalInt::of)
            .orElse(OptionalInt.empty());

现在变量asOptionalInt 的一个实例。

但是,您不能在第二个 sn-p 中使用该实例,因为 Stream.of(as) 会导致 Stream&lt;OptionalInt&gt;,我确信这不是您想要的。这只是链接答案的复制 sn-p 。请记住,它保存的值是原始的int,而不是String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多