我想对流进行如下反向排序,但编译时错误为if ((*iter).my_state()) {
auto splice_iter = iter;
cache_list_individuals.splice(cache_list_individuals.begin(), list_individuals, splice_iter);
}
。谁能纠正这个问题
"The method sorted() in the type IntStream is not applicable for the arguments ((<no type> o1, <no type> o2) -> {})"
答案 0 :(得分:13)
因为您使用的是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在评论中提到的那样:
切勿使用
(o1,o2) -> -o1.compareTo(o2)
之类的比较器函数。它 对于compareTo
实现返回完全合法Integer.MIN_VALUE
,在这种情况下,否定将失败并产生 结果不一致。一个有效的反向比较器将是(o1,o2)-> o2.compareTo(o1)
更好的方法是:
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中,从您发布的代码开始,您可以首先通过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
等。
答案 1 :(得分:4)
如果这是您的真实代码,那么使用IntStream.iterate
并生成从99
到0
的数字可能会更有效:
IntStream.iterate(99, i -> i - 1)
.limit(100)
.filter(x -> x % 2 != 0)
.forEachOrdered(System.out::println);
答案 2 :(得分:3)
简单的工具如:
private IntStream reverseSort(int from, int to) {
return IntStream.range(from, to)
.filter(x -> x % 2 != 0)
.sorted()
.map(i -> to - i + from - 1);
}