【问题标题】:Printing max element in a Deque<Integer>在 Deque<Integer> 中打印最大元素
【发布时间】:2021-07-17 11:52:20
【问题描述】:

我有一个来自 Integers 的 Deque,我将其用作 Que。我必须从中添加和删除元素,在某些情况下我需要在 Que 中打印最大值。

我尝试过的是:

System.out.println(deque.stream().max(Integer::compareTo));

但它会打印 - Optional[the current max int]

谢谢!

【问题讨论】:

  • 你可以通过optional.getAsInt()获取实际值

标签: java deque arraydeque


【解决方案1】:

这是因为java.util.Streammax 方法返回包裹在Optional 中的值。这是max方法的签名Optional&lt;T&gt; max(Comparator&lt;? super T&gt; comparator);

以下示例将为您提供预期的行为:

Optional<Integer> optionalOfMax = deque.stream().max(Integer::compareTo);
System.out.println(optionalOfMax.orElseThrow());

【讨论】:

  • 如果isPresent() 是真的,我们有什么理由打电话给orElseThrow()?是不是违背了 optional 的目的?
  • 是的。我最初的回复被编辑编辑了。初始版本改为调用.get()。但这将被orElseThrow() 取代。所以,最终版本应该调用.orElseThrow(),而不需要事先调用.isPresent()
【解决方案2】:

你可以这样做:

deque.stream().max(Integer::compareTo).ifPresent(System.out::println);

注意deque.stream().max(Integer::compareTo) 返回Optional&lt;Integer&gt;

或者,

deque.stream().flatMapToInt(x -> IntStream.of(x)).max().ifPresent(System.out::println);

Stream#flatMapToInt 返回一个 IntStream,其中包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。

【讨论】:

    【解决方案3】:

    您可以将队列中的整数包装器拆箱并使用IntStream.max(),它会返回一个 OptionalInt:

    deque.stream().mapToInt(Integer::intValue)
        .max()
        .ifPresent(System.out::println);
    

    如果max() 返回OptionalInt.empty(),这将不起作用,当双端队列为空时会发生这种情况。如果要检查是否为空,可以这样做,例如:

    deque.stream().mapToInt(Integer::intValue)
        .max()
        .ifPresentOrElse(System.out::println,
                () -> throw new RuntimeException("Attempt to get max of empty collection"));
    

    【讨论】:

      【解决方案4】:

      max-方法返回一个java.util.Optional。如果您只想返回一个 int-Value,您可以使用 java.util.Optional 中的 orElse-Method 来返回给定值,或者如果不存在,则返回另一个默认值。

      System.out.println(deque.stream().max(Integer::compareTo).orElse(0));
      

      【讨论】:

        【解决方案5】:

        您可以使用您编写的代码并将其扩展为.get()

        以下代码

        public static void main(String[] args) {
            // create a Deque that holds Integers
            Deque<Integer> myDQ = new ArrayDeque<Integer>();
            // add some of them
            myDQ.add(12);
            myDQ.add(13);
            myDQ.add(14);
            myDQ.add(15);
            myDQ.add(16);
            myDQ.add(20);
            myDQ.add(17);
            myDQ.add(18);
            myDQ.add(19);
            // and print
            System.out.println(
                    myDQ.stream()
                        .max(Integer::compareTo) // the largest one
                        .get() // not as Optional but only as Integer
            );
        }
        

        只打印20

        【讨论】:

        • 请注意,Optional 上的 get() 应该已弃用。请改用orElseThrow(),它的作用相同,但名称更好
        猜你喜欢
        • 2019-05-14
        • 2021-06-05
        • 2017-04-08
        • 2019-05-05
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2019-10-05
        • 2012-06-27
        相关资源
        最近更新 更多