在开发中,经常要判断集合中是否有指定的值,对于在集合中查询匹配数据,可以用到findFirst、findAny、anyMatch、allMatch和noneMatch这些方法。
先造点数据
pigs.add(new Pig(1, "猪爸爸", 31, "M", false));
pigs.add(new Pig(2, "猪妈妈", 28, "F", true));
pigs.add(new Pig(3, "乔治", 2, "M", false));
pigs.add(new Pig(4, "佩奇", 5, "F", false));
一、查找
1. findFirst
如果一个集合数据是有序的,而且你要查找符合条件的第一条数据。
这时用findFirst是比较合适的。
Optional<Pig> pigOptional = pigs.stream()
.filter(a -> a.getAge() > 5)
.findFirst();
if (pigOptional.isPresent()){
System.out.println(pigOptional.get().getName());
}
2. findAny
将返回集合中符合条件的任意一个元素。
Optional<Pig> anyPig = pigs.stream()
.filter(a -> a.getAge() < 30)
.findAny();
if (anyPig.isPresent()){
System.out.println(anyPig.get().getName());
}
3. findFirst和findAny如何选择?
-
如果你不关心返回的是哪一个数据,只要符合条件的就行,那就用findAny。
而且在并行流上,findAny限制更少。 -
如果你关心集合的顺序,要返回符合条件的第一个元素,那就用findFirst。
二、匹配
match是匹配的意思,返回结果是bool类型,要么匹配,要么就不匹配。
1. anyMatch
是否有1条age>50的数据?
Boolean anyOldThan50 = pigs.stream()
.anyMatch(a -> a.getAge() > 50);
2. allMatch
是否所有数据都满足age<50
注意:如果集合为空,也就是流为空,allMatch还是会返回true
Boolean allLittleThan50 = pigs.stream()
.allMatch(a -> a.getAge() < 50);
3. noneMatch
是否所有数据都不满足age<50
Boolean noneLittleThan50 = pigs.stream()
.noneMatch(a -> a.getAge() < 50);