在 Deque<Integer> 中打印最大元素

Printing max element in a Deque<Integer>

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

我试过的是:

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

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

谢谢!

那是因为 java.util.Streammax 方法 returns 你的值包含在 Optional 中。这是 max 方法的签名 Optional<T> max(Comparator<? super T> comparator);

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

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

您可以只使用您编写的代码并将其扩展 .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.

您可以按照以下方式进行:

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

注意 deque.stream().max(Integer::compareTo) returns Optional<Integer>.

或者,

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

Stream#flatMapToInt returns 一个 IntStream 由将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容组成的结果。

您可以在队列中拆箱 Integer 包装器并使用 IntStream.max(),其中 returns 一个 OptionalInt:

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

如果 max() returns OptionalInt.empty(),这将不执行任何操作,这发生在双端队列为空时。如果你想检查是否为空,你可以这样做,例如:

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

max-方法 return 是 java.util.Optional。如果您只想 return 一个 int 值,您可以使用 orElse-方法从 java.util.Optional 到 return 给定值,或者如果不存在,另一个默认值。

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