当前位置: 首页 > 后端技术 > Java

Java8排序的10个姿势,太美了!同事抱怨说听不懂,.

时间:2023-04-02 01:11:12 Java

大家好,我是堆栈管理员。这篇(Java技术栈)平时会发布很多干货,值得大家关注。它们是堆栈管理器多年积累的经验精华。希望对大家有所帮助。!废话不多说,不信继续往下看,=-=今天栈长给大家分享Java8排序的10个姿势,排序的技巧有那么多,其实就是为了Java8中使用Lambda、Stream、方法引用等知识点串在一起,stackmanager的同事看不懂。.传统排序现在有一个List集合:publicstaticListLIST=newArrayList(){{add(newUser("Lisa",23));添加(新用户(“汤姆”,11));添加(新用户(“约翰”,16));添加(新用户(“杰西”,26));添加(新用户(“托尼”,26));添加(新用户(“混乱”,26));添加(新用户(“鲍勃”,19));添加(新用户(“瑜伽”,65));}};jdk8前排序:/***jdk8前排序*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortPreJdk8(){System.out.println("=====jdk8before排序=====");Listlist=newArrayList<>(LIST);Collections.sort(list,newComparator(){@Overridepublicintcompare(Useru1,Useru2){returnu1.getAge().compareTo(u2.getAge());}});for(Useruser:list){System.out.println(user);}System.out.println();}在Java8出来之前,排序基本上都要这么写,但是JAva8出来这么多年了,如果你还这么排序,那就太low了!Java8中的排序Java8的新知识点本文不再详述。不知道怎么用的可以关注公众号:Java技术栈,后台回复:java,我写的Java8+系列教程有很多,大家快去吧直奔本文干货,看我如何用Java8整理!1、Lambda排序(有参数类型)Java8中的List接口增加了一个排序默认方法:接收Comparator接口参数,这个接口在Java8中被修改为函数式接口:那么我们可以将Comparator接口参数改为中的形式在Lambda表达式中,匿名内部类被Lambda表达式淘汰,代码更加简洁。使用示例如下:/***jdk8lambda排序,带参数类型*@author:栈长度*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8Lambda1(){System.out.println("=====jdk8lambda排序,参数类型=====");列表<用户>list=newArrayList<>(LIST);list.sort((用户u1,用户u2)->u1.getAge().compareTo(u2.getAge()));list.forEach(System.out::println);System.out.println();}2.Lambda排序(不带参数类型)Lambda表达式可以不带参数类型例如下面的例子:/***jdk8lambda排序,不带参数类型*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8Lambda2(){System.out.println("=====jdk8lambda排序,无参数类型=====");列表<用户>list=newArrayList<>(LIST);list.sort((u1,u2)->u1.getAge().compareTo(u2.getAge()));list.forEach(System.out::println);System.out.println();}代码中的u1和u2没有用User类修饰,会自动推断为User类型,因为集合本身就是一个User泛型。3.静态方法引用排序除了Lambda表达式,类的静态方法引用也可以使用:/***jdk8静态方法引用排序*@author:栈长*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8StaticMethodRef(){System.out.println("=====jdk8静态方法引用排序=====");列表<用户>list=newArrayList<>(LIST);list.sort(User::compareAge);list.forEach(System.out::println);System.out.println();}使用方法引用后代码是不是更简洁了?4.实例方法引用排序不仅可以使用类的静态方法,还可以使用类实例的公共方法引用:/***jdk8实例方法引用排序*@author:栈长*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8InstanceMethodRef(){System.out.println("=====jdk8实例方法引用排序=====");列表<用户>list=newArrayList<>(LIST);list.sort(User.getInstance()::compare);list.forEach(System.out::println);System.out.println();}这个getInstance在这里其实就是一个单例,但是跟单例没有关系,任何类的Instances都可以。另外,我也把这些知识点整理成了小程序,经常在面试中测试。可以使用Java面试库小程序在线刷题。5、Comparator工具类排序(升序)Java8在Comparator接口中增加了一个比较方法:该工具方法需要提供一个功能接口参数,即比较哪个字段,最后返回Comparator接口实例。使用示例如下:/***jdk8升序排序,Comparator提供的静态方法*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8ComparatorAsc(){System.out.println("=====jdk8升序排序=====");列表<用户>list=newArrayList<>(LIST);list.sort(Comparator.comparing(User::getAge));//list.sort(Comparator.comparing((user)->user.getAge()));list.forEach(System.out::println);System.out.println();}既然是函数式接口,可以使用Lambda,将方法引用形式作为参数传入。本文所有完整示例源码已上传:https://github.com/javastacks...6.Comparator工具类排序(降序)也可以使用Comparator.reversed/reversedOrder方法进行降序:/***jdk8Comparator工具类排序(降序)*@author:栈长*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8ComparatorDesc(){System.out.println("=====jdk8descendingdescending=====");列表<用户>list=newArrayList<>(LIST);list.sort(Comparator.comparing(User::getAge).reversed());list.forEach(System.out::println);System.out.println();}Comparator.reversed和reversedOrder的区别在于reversedOrder适用于基本数据类型集合的自然排序,而reversed是对Comparator本身的封装,适用于对象的自定义排序。7.组合排序如果想先按用户年龄排序,年龄相同再按姓名排序,可以在Comparator接口中使用thenComparing。默认方法:privatestaticvoidsortGroupWithJdk8(){System.out.println("=====jdk8组合排序=====");列表<用户>list=newArrayList<>(LIST);list.sort(Comparator.comparing(User::getAge).thenComparing(User::getName));列表。forEach(System.out::println);System.out.println();}输出结果:=====jdk8组合排序=====11:Tom16:John19:Bob23:Lisa26:Jessie26:Messy26:Tony65:Yoga注意26岁的人排序再次以自然顺序命名。8、流式排序也可以将List集合转化为Stream,然后使用它的sorted方法:sorted方法也接收Comparator接口参数,所以我们也可以使用Lambda、方法引用、Comparator接口本身提供的工具方法来调用它:/***jdk8流排序*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8Stream(){System.out.println("=====jdk8流排序=====”);列表<用户>list=newArrayList<>(LIST);list=list.stream().sorted(User::compareAge).collect(Collectors.toList());//list=list.stream().sorted((u1,u2)->u1.getAge().compareTo(u2.getAge())).collect(Collectors.toList());//list=list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());list.forEach(System.out::println);System.out.println();}所以使用Stream还可以扩展多种排序方式,见注释部分,这里不再展开。另外,之前写过Stream系列的专题,这里就不展开了。不懂的可以关注公众号Java技术栈,然后在公众号Java教程菜单中阅读。9.并行流排序有流排序,然后是并行流(parallelStream)排序:/***jdk8并行流排序*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortWithJdk8parallelStream(){System.out.println("=====jdk8流排序=====");列表<用户>list=newArrayList<>(LIST);list=list.parallelStream().sorted(User::compareAge).collect(Collectors.toList());list.forEach(System.out::println);System.out.println();}10.Collections排序由于在Java8中,Comparator接口被定义为Functional接口,那么我们传统的Collections工具类就可以一改了,我们也可以使用Lambda,方法引用,工具方法Comparator接口自己提供调用它:/***jdk8Collections排序*@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidsortWithCollections(){System.out.println("=====jdk8集合排序=====");Listlist=newArrayList<>(LIST);Collections.sort(list,User::compareAge);//Collections.sort(list,(u1,u2)->u1.getAge().compareTo(u2.getAge()));//集合。排序(列表,Comparator.com配对(用户::getAge));list.forEach(System.out::println);System.out.println();}你学会了吗?小结本文站长列举了Java8中的10种排序方式,其实就是10种情况,还可以扩展更多,仅供大家参考。总体来说可以分为3类:List接口中的sortMethodStream接口中的sorted方法,Collections.sort方法,工具类方法都可以接收Comparator接口作为参数,Comparator接口在Java8中定义为函数式接口,所以我们可以使用Lambda表达式和方法引用,Comparator自带的工具类等不同的参数形式传入,可以说是太美了这些方法如何执行?栈长写了一个小例子,10000条数据的集合,使用静态方法引用进行测试:longstart=System.currentTimeMillis();Listlist1=newArrayList<>(list);list1.sort(User::compareAge);System.out.println("List.sort:"+(System.currentTimeMillis()-start));start=System.currentTimeMillis();Listlist2=newArrayList<>(list);Collections.sort(list2,User::compareAge);System.out.println("Collections.sort:"+(System.currentTimeMillis()-start));start=System.currentTimeMillis();Listlist3=newArrayList<>(list);list3.stream().sorted(User::compareAge).collect(Collectors.toList());System.out.println("Stream.sorted:"+(System.currentTimeMillis()-开始));输出结果:List.sort:18Collections.sort:18Stream.sorted:48Stream因为多了两个转换过程,稍微慢了点,但是如果数据量不是特别大,比如1000条数据的集合,这个的表现三者相差无几,排序基本在1毫秒内完成。对于普通小数据的排序,闭着眼睛都能用。那么,你失学了吗?赶快在项目中使用起来,提升你的硬实力,让同事对你刮目相看!又啰嗦了一句,不知道Java8新知识点怎么用的可以关注公众号:Java技术栈,后台回复:java,我写了一堆Java8+系列教程。你还知道哪些排序技巧?欢迎留言分享~本文所有完整示例源码已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Java面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。最后,如果觉得我的文章对你有用,动动你的小手,送给正在看的人,转发吧,原创不易,楼主需要你的鼓励。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均属侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!