我有一个来自 Integers 的 Deque,我将其用作 Que。我必须从中添加和删除元素,在某些情况下,我需要在 Que 中打印最大值。
我尝试过的事情是:
System.out.println(deque.stream().max(Integer::compareTo));
但它打印 - Optional[the current max int]。
谢谢!
我有一个来自 Integers 的 Deque,我将其用作 Que。我必须从中添加和删除元素,在某些情况下,我需要在 Que 中打印最大值。
我尝试过的事情是:
System.out.println(deque.stream().max(Integer::compareTo));
但它打印 - Optional[the current max int]。
谢谢!
那是因为返回值的max方法包含在. 这是 max 方法的签名java.util.StreamOptionalOptional<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。
您可以在队列中拆箱 Integer 包装器并使用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-Method fromjava.util.Optional返回给定值,或者如果不存在,则返回另一个默认值。
System.out.println(deque.stream().max(Integer::compareTo).orElse(0));