为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8流反向顺序

Java 8流反向顺序

潇湘沐 2019-09-24 09:58:41
一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么?具体问题:IntStream提供了生成特定范围内整数的范围方法IntStream.range(-range, 0),现在我想将其从0切换为负数将无法正常工作,也无法使用Integer::compareList<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)我在这里想念什么?
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

优雅的解决方案


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

list.stream()

    .boxed() // Converts Intstream to Stream<Integer>

    .sorted(Collections.reverseOrder()) // Method on Stream<Integer>

    .forEach(System.out::println);


查看完整回答
反对 回复 2019-09-24
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这里的许多解决方案都对进行排序或反转IntStream,但这不必要地需要中间存储。Stuart Marks的解决方案是解决之道:


static IntStream revRange(int from, int to) {

    return IntStream.range(from, to).map(i -> to - i + from - 1);

}

它也可以正确处理溢出,并通过以下测试:


@Test

public void testRevRange() {

    assertArrayEquals(revRange(0, 5).toArray(), new int[]{4, 3, 2, 1, 0});

    assertArrayEquals(revRange(-5, 0).toArray(), new int[]{-1, -2, -3, -4, -5});

    assertArrayEquals(revRange(1, 4).toArray(), new int[]{3, 2, 1});

    assertArrayEquals(revRange(0, 0).toArray(), new int[0]);

    assertArrayEquals(revRange(0, -1).toArray(), new int[0]);

    assertArrayEquals(revRange(MIN_VALUE, MIN_VALUE).toArray(), new int[0]);

    assertArrayEquals(revRange(MAX_VALUE, MAX_VALUE).toArray(), new int[0]);

    assertArrayEquals(revRange(MIN_VALUE, MIN_VALUE + 1).toArray(), new int[]{MIN_VALUE});

    assertArrayEquals(revRange(MAX_VALUE - 1, MAX_VALUE).toArray(), new int[]{MAX_VALUE - 1});

}


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 1907 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信