gpt4 book ai didi

java - 反向排序流

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:09 27 4
gpt4 key购买 nike

我想对如下所示的流进行反向排序,但出现编译时错误 "The method sorted() in the type IntStream is not applicable for the arguments ((<no type> o1, <no type> o2) -> {})" .谁能纠正这个

IntStream.range(1, 100)
.filter(x -> x%2 != 0)
.sorted((o1,o2) -> -o1.compareTo(o2))
.forEach(System.out::println);

最佳答案

说明

因为您正在使用 IntStream它只有一个重载 sorted方法,这是自然顺序(这是有道理的)。

相反,将来自 IntStream 的流框起来至 Stream<Integer>那么它就足够了:

 IntStream.range(1, 100)
.filter(x -> x % 2 != 0)
.boxed() // <--- boxed to Stream<Integer>
.sorted((o1,o2) -> -o1.compareTo(o2)) // now we can call compareTo on Integer
.forEach(System.out::println);

但是,正如@Holger 在评论中提到的那样:

never use a comparator function like (o1,o2) -> -o1.compareTo(o2). It is perfectly legal for a compareTo implementation to return Integer.MIN_VALUE, in which case negation will fail and produce inconsistent results. A valid reverse comparator would be (o1,o2) -> o2.compareTo(o1)

改进代码的建议。 JDK8

更好的方法是:

IntStream.range(1, 100)
.filter(x -> x % 2 != 0)
.boxed()
.sorted(Comparator.reverseOrder())
.forEachOrdered(System.out::println);

为什么?

  • 已经有一个内置的比较器来执行如上所示的相反顺序。
  • 如果您想保证打印时元素按排序顺序显示,那么使用forEachOrdered (向@Holger 大声喊叫,因为他总是提醒我)

或者按照@Holger 的建议,它都可以简化为如下所示:

 IntStream.range(0, 50)
.map(i -> 99-i*2)
.forEachOrdered(System.out::println);

JDK9 变体

顺便说一句,在 JDK9 中,从您帖子中的代码开始,您可以先通过 iterate 对其进行简化到:

IntStream.iterate(1, i  -> i <= 99, i -> i + 2)
.boxed()
.sorted(Comparator.reverseOrder())
.forEachOrdered(System.out::println);

使用这种方法,我们可以避免过滤器中间操作和 2 的递增。

最后你可以进一步简化它:

IntStream.iterate(99, i  -> i > 0 , i -> i - 2)
.forEachOrdered(System.out::println);

通过这种方法,我们可以避免 filter , boxed , sorted等。

关于java - 反向排序流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53764661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com