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

你还在迭代搜索集合吗?放过我吧!Java8的一行代码真的很优雅!

时间:2023-04-02 09:23:24 Java

背景是的,如果要搜索List集合,在Java8之前可以使用它自带的contains/indexOf方法来查找元素,但是只能查找完整的元素,不能模糊查找或者自定义查找,这时候真的只能可以穿越。但是现在都2021年了,你还在用传统的遍历集合的方式来搜索List集合元素吗?那你就太out了,用Java8中的Stream来查找元素,一行代码搞定,真是优雅!本文不会介绍Stream的基础知识。之前在Stream系列写过一个话题。不懂的可以关注公众号Java技术栈,然后在公众号Java教程菜单中阅读。流搜索在Java8中,List集合可以转换为Stream。Stream提供了一系列强大的搜索功能,例如:filter、find*、*Match等方法,一行代码即可完成搜索。比如现在有初始数据:publicstaticListlist=newArrayList<>();/***@author:stacklength*@from:公众号Java技术栈*/@BeforeEachpublicvoidinitList(){list.add(newUser("公众号Java技术栈-小资",22,1));list.add(newUser("公众号Java技术栈-Tom",38,1));list.add(newUser("公众号Java技术栈-Jessica",43,0));list.add(newUser("公众号Java技术栈-John",15,1));list.add(newUser("公众号Java技术栈-Lily",25,0));list.add(newUser("公众号Java技术栈-Lambs",28,0));list.add(newUser("Java技术栈-Jack",45,1));list.add(新用户("公众号Java技术栈-Addy",9,0));list.add(newUser("公众号Java技术栈-Bob",61,1));list.add(newUser("公众号Java技术Stack-Candy",26,0));}用户信息为:name,age,gender.filter(filter)使用filter方法实现自定义搜索,比如搜索List\collectionPeople:/***Collectionfiltering*@author:stacklength*@from:公众号Java技术栈*/@Testpublicvoidfilter(){System.out.println("搜索名字中包含c的所有人");list.stream().filter(u->u.getName().contains("c")).forEach(System.out::println);}输出结果:findFirst(查找第一个)findinStream中的第一个元素,比如在List\集合中??搜索第一个年龄大于30的人:/***搜索集合中的第一个*@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidfindFirst(){System.out.println("搜索第一个年龄大于30的人");用户user=list.stream().filter(u->u.getAge()>30).findFirst().get();System.out.println(user);}输出结果:例子是先filter再findFirst,如果不需要条件就不用filter了。如果不了解Stream的基础知识,可以关注公众号Java技术栈,然后阅读公众号Java教程菜单中写的Java系列教程。findAny(findanyone)在Stream中查找任意元素,比如在List\集合中??搜索任意年份经验超过30的人:/***设置任意一个搜索*@author:stacklength*@来自:公众号Java技术栈*/@TestpublicvoidfindAny(){System.out.println("搜索任何年龄大于30的人");用户user=list.stream().filter(u->u.getAge()>30).findAny().get();System.out.println(user.getName());}输出结果:为什么结果和findFirst一样?它与findFirst有何不同?findAny就是找任意一个元素。如果串行流中数据较少,一般会返回第一个元素,但在并行流中,它返回的结果是不确定的,可能是流中的任意元素。findAny的目的是为了提高并行流操作的性能,但是如果你需要一个固定的结果,建议使用findFirst。本文所有完整示例源码均已上传:https://github.com/javastacks...anyMatch(任意匹配)查找Stream中的元素是否有匹配,比如在Stream中搜索XX人List\collection:/***Collection匹配任意元素*@author:栈长度*@from:公众号Java技术栈*/@TestpublicvoidanyMatch(){System.out.println("Jack是否存在:"+list.stream().anyMatch(u->u.getName().contains("Jack")));System.out.println("DoesJetexist:"+list.stream().anyMatch(u->u.getName().contains("Jet")));}输出结果:*Match返回的结果为布尔类型。noneMatch(空匹配)查找Stream中的元素是否没有匹配,比如查找List\集合中??是否没有XX人:/***该集合没有匹配到任何元素*@作者:堆栈长度*@from:公众号Java技术栈*/@TestpublicvoidnoneMatch(){System.out.println("DoesJacknotexist:"+list.stream().noneMatch(u->u.getName().contains("Jack")));System.out.println("DoesJetnotexist:"+list.stream().noneMatch(u->u.getName().contains("Jack")));}输出结果:该方法的功能只是与anyMatch相反。allMatch(fullmatch)查找Stream中的所有元素是否都匹配,比如查找List\集合中??的所有人是否都比XX年长:/***集合匹配所有元素*@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidallMatch(){System.out.println("所有年龄都大于3:"+list.stream().allMatch(u->u.getAge()>2));System.out.println("大家的年龄都大于30:"+list.stream().allMatch(u->u.getAge()>30));}输出结果:总结以上所有搜索即可一行代码,是不是简单又优雅?对于List以外的集合,可以转为List,再转为Stream进行查找操作。对于Stream来说,搜索只是一门儿童科学。你学会使用了吗?赶快发给身边的同事吧,让你的代码更优雅!如果不知道如何使用Java8的新知识点(Lambda、Stream、函数式接口等),可以关注公众号:Java技术栈,在Java教程菜单里看,我写过Java8+系列教程的有一堆。本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!好了,今天的分享就到这里,栈长稍后会分享更多有趣的Java技术和最新的技术资料,关注公众号Java技术栈第一时间推送。我也整理了Java主流面试题和参考答案,在公众号后台回复关键词“面试”刷题。最后,如果觉得我的文章对你有用,动动你的小手,送给正在看的人,转发吧,原创不易,楼主需要你的鼓励。版权声明:本文为公众号《Java技术栈》原创,原创不易,转载或引用本文内容请注明出处,抄袭者一律举报+投诉,并保留追究权利法律责任。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!