问题描述
我有一个来自 Integers 的 Deque,我将它用作 Que。我必须在其中添加和删除元素,在某些情况下,我需要在 Que 中打印最大值。
我尝试过的事情是:
System.out.println(deque.stream().max(Integer::compareto));
但它打印 - Optional[the current max int]
。
谢谢!
解决方法
那是因为 max
的 java.util.Stream
方法返回包裹在 Optional
中的值。这是 max 方法 Optional<T> max(Comparator<? super T> comparator);
下面的示例将为您提供预期的行为:
Optional<Integer> optionalOfMax = deque.stream().max(Integer::compareTo);
System.out.println(optionalOfMax.orElseThrow());
,
你可以这样做:
deque.stream().max(Integer::compareTo).ifPresent(System.out::println);
请注意,deque.stream().max(Integer::compareTo)
返回 Optional<Integer>
。
或者,
deque.stream().flatMapToInt(x -> IntStream.of(x)).max().ifPresent(System.out::println);
Stream#flatMapToInt
返回一个 IntStream
,其中包含用通过将提供的映射函数应用于每个元素而生成的映射流的内容替换此流的每个元素的结果。
您可以直接使用您编写的代码并通过 .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
。
您可以将队列中的整数包装器拆箱并使用 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"));
,
max
-方法返回一个 java.util.Optional
。如果您只想返回一个 int-Value,您可以使用 orElse
中的 java.util.Optional
-Method 返回给定值,如果不存在,则返回另一个默认值。
System.out.println(deque.stream().max(Integer::compareTo).orElse(0));