java8 查找和匹配方法(`anyMatch`)(`allMatch`、`noneMatch`)(`findAny`)(`findFirst`)
5.3 查找和匹配
5.3.1 检查谓词是否至少匹配一个元素(anyMatch
)
anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”。
boolean anyMatch(Predicate<? super T> predicate);
// 菜单里面是否有素食可选择
if(menu.stream().anyMatch(Dish::isVegetarian)){
System.out.println("The menu is (somewhat) vegetarian friendly!!");
}
5.3.2 检查谓词是否匹配所有元素(allMatch
、noneMatch
)
allMatch方法的工作原理和anyMatch类似,但它会看看流中的元素是否都能匹配给定的谓词。
boolean allMatch(Predicate<? super T> predicate);
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);
和allMatch相对的是noneMatch。它可以确保流中没有任何元素与给定的谓词匹配。
boolean noneMatch(Predicate<? super T> predicate);
boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000);
anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的短路,这就是大家熟悉的Java中&&
和||
运算符短路在流中的版本。
短路操作:
allMatch
、anyMatch
、noneMatch
、findFirst
、findAny
、limit
---------------------------------------------
# 任意满足
---------------------------------------------
List<Person> list = new ArrayList<>();
boolean present2 = list.stream().anyMatch(a -> a.getAge() > 10);
boolean present1 = list.stream().filter(a -> a.getAge() > 10).findAny().isPresent();
---------------------------------------------
# 全部满足
---------------------------------------------
boolean present3 = list.stream().allMatch(a -> a.getAge() > 10);
Boolean high = true;
Boolean rich = true;
Boolean cool = true;
boolean b = Stream.of(high, rich, cool).allMatch(BooleanUtils::isTrue);
---------------------------------------------
# 全不满足
---------------------------------------------
boolean present4 = list.stream().noneMatch(a -> a.getAge() > 10);
5.3.3 查找元素(findAny
)
findAny方法将返回当前流中的任意元素。
Optional<T> findAny();
Optional<Dish> dish = menu.stream()
.filter(Dish::isVegetarian)
.findAny();
5.3.4 查找第一个元素(findFirst
)
Optional<T> findFirst();
List<Integer> someNumbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> firstSquareDivisibleByThree = someNumbers.stream()
.map(x -> x * x)
.filter(x -> x % 3 == 0)
.findFirst(); // 9
# 获取第一条数据
String str = list.stream().findFirst().orElse(null);
为什么会同时有findFirst和findAny呢?
答案是 并行。找到第一个元素在并行上限制更多。如果你不关心返回的元素是哪个,请使用findAny,因为它在使用并行流时限制较少。
-----------------------------------------------------------------------------读书笔记摘自 书名:Java 8实战 作者:[英] Raoul-Gabriel Urma [意] Mario Fusco [英] Alan M