请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

流中sorted操作是升序的,如果要自定义操作,是要重写comparing的实现吗?

RT所示,如果是要重写comparing的实现的话,能否向匿名内部类在流中实现还是在外面实现呢?第一次接触stream流,可能问题有点愚蠢,请老师指教一下,感谢

正在回答

1回答

流中元素如何已经实现了Compare接口,可以直接使用第一/第二种方式进行正序/倒序排列。如何没有实现Compare接口,或者需要自定义排序规则,可以使用第三种方式排序。

@Test
public void test() {

    List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);

    // 第一:正序排列
    list.stream().sorted().forEach(System.out::println);

    // 第二:倒序排列
    list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);

    // 第三:按奇偶排序:奇数在先,偶数在后
    list.stream().sorted(Comparator.comparing(item -> {
        // 奇数为1;偶数为-1
        return item % 2 == 0 ? 1 : -1;
    })).forEach(System.out::println);

}


0 回复 有任何疑惑可以回复我~
  • 提问者 煮沧海 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-12-09 17:23:45
  • 提问者 煮沧海 #2
    // 奇数为 1;偶数为 -1
     return item % 2 == 0 ? 1 : -1;
    这个判断是偶数为1 奇数为 -1 啊,老师。难道有玄机?
    我看源码里面是
    (Comparator<T> & Serializable)
                (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    compareTo默认是升序的,但是这个keyExtractor是item映射的吗?
    c1和c2是另一个lambda的入参,但是这个与item有何关系呢,值是什么呢?感觉不理解的地方有点多,老师抽空看下,万分感谢。。没研究透
    回复 有任何疑惑可以回复我~ 2019-12-09 18:36:38
  • 那个奇偶的是我写错了。关于后面那个问题,你QQ联系我吧,有点儿复杂,一两句说不明白。
    回复 有任何疑惑可以回复我~ 2019-12-10 22:39:05
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信