背景是的,如果要搜索List集合,在Java8之前可以使用它自带的contains/indexOf方法来查找元素,但是只能查找完整的元素,不能模糊查找或者自定义查找,这时候真的只能可以穿越。但是现在都2021年了,你还在用传统的遍历集合的方式来搜索List集合元素吗?那你就太out了,用Java8中的Stream来查找元素,一行代码搞定,真是优雅!本文不会介绍Stream的基础知识。之前在Stream系列写过一个话题。不懂的可以关注公众号Java技术栈,然后在公众号Java教程菜单中阅读。流搜索在Java8中,List集合可以转换为Stream。Stream提供了一系列强大的搜索功能,例如:filter、find*、*Match等方法,一行代码即可完成搜索。比如现在有初始数据:publicstaticListlist=newArrayList<>();/***@author:栈长*@from:公众号Java技术栈*/@BeforeEachpublicvoidinitList(){list.add(newUser("Java技术栈-Petty",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技术Stack-Lily",25,0));list.add(newUser("公众号Java技术栈-Lambs",28,0));list.add(newUser("公众号Java技术栈-Jack",45,1));list.add(newUser("公众号Java技术栈-Addy",9,0));list.add(newUser("公众号Java技术栈-Bob",61,1));list.add(newUser("公众号Java技术栈-Candy",26,0));}用户信息有:name,age,gender.filter(filter)使用filter方法实现自定义搜索,比如搜索List集合中所有名字包含c的人:/***集合过滤*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidfilter(){System.out.println("搜索所有名字中包含c的人");list.stream().filter(u->u.getName().contains("c")).forEach(System.out::println);}输出结果:findFirst(找第一个)在Stream中找到第一个元素,比如在List集合中搜索年龄大于30的第一个人:/***collectionsearchfirst*@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidfindFirst(){System.out.println("搜索第一个年龄大于30的人");Useruser=list.stream().filter(u->u.getAge()>30)。findFirst().get();System.out.println(user);}输出结果:例子是先filter再findFirst,如果不需要条件就不用filter了。findAny(findanyone)查找Stream中任意一个元素,比如查找List集合中任何年龄大于30的人:/***collection查找任意一个*@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidfindAny(){System.out.println("搜索任何年龄大于30的人");Useruser=list.stream().filter(u->u.getAge()>30).findAny().get();System.out.println(user.getName());}输出结果:为什么结果和findFirst一样?它与findFirst有何不同?findAny就是找任意一个元素。如果串行流中数据较少,一般会返回第一个元素,但在并行流中,它返回的结果是不确定的,可能是流中的任意元素。findAny的目的是为了提高并行流操作的性能,但是如果你需要一个固定的结果,建议使用findFirst。anyMatch(anymatch)查找Stream中的元素之间是否存在匹配,比如查找List集合中是否有XX人:/***该集合匹配任意元素*@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidanyMatch(){System.out.println("Jack是否存在:"+list.stream().anyMatch(u->u.getName().contains("Jack“)));系统。out.println("是否有Jet:"+list.stream().anyMatch(u->u.getName().contains("Jet")));}输出结果:*Match返回boolean类型。noneMatch(空匹配)查找Stream中的元素是否没有匹配,比如查找List集合中是否没有XX人:/***该集合不匹配任何元素*@author:堆叠长度*@from:公众号Java技术栈*/@TestpublicvoidnoneMatch(){System.out.println("是否有Jack:"+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));}输出结果:用一行总结以上所有的搜索操作ofcode是可以做到的,是不是简单又优雅?对于List以外的集合,可以转为List,再转为Stream进行查找操作。对于Stream来说,搜索只是一门儿童科学。你学会使用了吗?赶快发给身边的同事吧,让你的代码更优雅!本文所有完整示例源码已上传:https://github.com/javastacks/javastack