猿问

Java 8流反向顺序

一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么?


具体问题:


IntStream提供了生成特定范围内整数的范围方法IntStream.range(-range, 0),现在我想将其从0切换为负数将无法正常工作,也无法使用Integer::compare


List<Integer> list = Arrays.asList(1,2,3,4);

list.stream().sorted(Integer::compare).forEach(System.out::println);

与IntStream我会得到这个编译器错误


错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare)


我在这里想念什么?


潇湘沐
浏览 1908回答 3
3回答

万千封印

优雅的解决方案List<Integer> list = Arrays.asList(1,2,3,4);list.stream()&nbsp; &nbsp; .boxed() // Converts Intstream to Stream<Integer>&nbsp; &nbsp; .sorted(Collections.reverseOrder()) // Method on Stream<Integer>&nbsp; &nbsp; .forEach(System.out::println);

凤凰求蛊

这里的许多解决方案都对进行排序或反转IntStream,但这不必要地需要中间存储。Stuart Marks的解决方案是解决之道:static IntStream revRange(int from, int to) {&nbsp; &nbsp; return IntStream.range(from, to).map(i -> to - i + from - 1);}它也可以正确处理溢出,并通过以下测试:@Testpublic void testRevRange() {&nbsp; &nbsp; assertArrayEquals(revRange(0, 5).toArray(), new int[]{4, 3, 2, 1, 0});&nbsp; &nbsp; assertArrayEquals(revRange(-5, 0).toArray(), new int[]{-1, -2, -3, -4, -5});&nbsp; &nbsp; assertArrayEquals(revRange(1, 4).toArray(), new int[]{3, 2, 1});&nbsp; &nbsp; assertArrayEquals(revRange(0, 0).toArray(), new int[0]);&nbsp; &nbsp; assertArrayEquals(revRange(0, -1).toArray(), new int[0]);&nbsp; &nbsp; assertArrayEquals(revRange(MIN_VALUE, MIN_VALUE).toArray(), new int[0]);&nbsp; &nbsp; assertArrayEquals(revRange(MAX_VALUE, MAX_VALUE).toArray(), new int[0]);&nbsp; &nbsp; assertArrayEquals(revRange(MIN_VALUE, MIN_VALUE + 1).toArray(), new int[]{MIN_VALUE});&nbsp; &nbsp; assertArrayEquals(revRange(MAX_VALUE - 1, MAX_VALUE).toArray(), new int[]{MAX_VALUE - 1});}
随时随地看视频慕课网APP

相关分类

Java
我要回答