当前位置:   article > 正文

Java 8 Predicate花样用法_predicate

predicate

1. 简介

本文介绍Java 8 Predicate链.

2. 基本用法

怎么使用简单的Predicate来过滤list中的name

  1. @Test
  2. public void whenFilterList_thenSuccess(){
  3. List<String> names = Arrays.asList("Adam", "Alexander", "John", "Tom");
  4. List<String> result = names.stream()
  5. .filter(name -> name.startsWith("A"))
  6. .collect(Collectors.toList());
  7. assertEquals(2, result.size());
  8. assertThat(result, contains("Adam","Alexander"));
  9. }

我们使用Predicate来筛选以大写字母A开头的姓名。

name -> name.startsWith("A")

那么如果多个条件这么办?

3. 多条件过滤

  1. @Test
  2. public void whenFilterListWithMultipleFilters_thenSuccess(){
  3. List<String> result = names.stream()
  4. .filter(name -> name.startsWith("A"))
  5. .filter(name -> name.length() < 5)
  6. .collect(Collectors.toList());
  7. assertEquals(1, result.size());
  8. assertThat(result, contains("Adam"));
  9. }

用两个filter传入两个 Predicate分别过滤  【以A开头的】和【姓名长度小于5】的。

4. 复杂条件

  1. @Test
  2. public void whenFilterListWithComplexPredicate_thenSuccess(){
  3. List<String> result = names.stream()
  4. .filter(name -> name.startsWith("A") && name.length() < 5)
  5. .collect(Collectors.toList());
  6. assertEquals(1, result.size());
  7. assertThat(result, contains("Adam"));
  8. }

使用一个 filter 传入复杂的Predicate.

5. 组合使用Predicate

Predicates可以将 Predicate.and(), Predicate.or() 和 Predicate.negate()组合起来使用。

5.1. Predicate.and()

  1. @Test
  2. public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess(){
  3. Predicate<String> predicate1 = str -> str.startsWith("A");
  4. Predicate<String> predicate2 = str -> str.length() < 5;
  5. List<String> result = names.stream()
  6. .filter(predicate1.and(predicate2))
  7. .collect(Collectors.toList());
  8. assertEquals(1, result.size());
  9. assertThat(result, contains("Adam"));
  10. }

两个条件都要满足

5.2. Predicate.or()

满足其中一个即可

  1. @Test
  2. public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess(){
  3. Predicate<String> predicate1 = str -> str.startsWith("J");
  4. Predicate<String> predicate2 = str -> str.length() < 4;
  5. List<String> result = names.stream()
  6. .filter(predicate1.or(predicate2))
  7. .collect(Collectors.toList());
  8. assertEquals(2, result.size());
  9. assertThat(result, contains("John","Tom"));
  10. }

5.3. Predicate.negate()

将此条件取反

Predicate<String> predicate2 =  str -> str.length() < 4;

相当于

Predicate<String> predicate2 =  str -> str.length() >= 4;

  1. @Test
  2. public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess(){
  3. Predicate<String> predicate1 = str -> str.startsWith("J");
  4. Predicate<String> predicate2 = str -> str.length() < 4;
  5. List<String> result = names.stream()
  6. .filter(predicate1.or(predicate2.negate()))
  7. .collect(Collectors.toList());
  8. assertEquals(3, result.size());
  9. assertThat(result, contains("Adam","Alexander","John"));
  10. }

5.4. 内联的方式组合使用Predicates

  1. @Test
  2. public void whenFilterListWithCombinedPredicatesInline_thenSuccess(){
  3. List<String> result = names.stream()
  4. .filter(((Predicate<String>)name -> name.startsWith("A"))
  5. .and(name -> name.length()<5))
  6. .collect(Collectors.toList());
  7. assertEquals(1, result.size());
  8. assertThat(result, contains("Adam"));
  9. }

6. 组合Predicates集合

在开始介绍之前,简单介绍下  reduce 函数:

 `java.util.stream.Stream#reduce(T, java.util.function.BinaryOperator<T>)`

源码的注释中给出等价的写法:

  1. T result = identity;
  2. for (T element : this stream)
  3. result = accumulator.apply(result, element)
  4. return result;

即,第一个参数当做初始值,后续参数和第一个参数进行运算,最终得到结果。

接下来我们看下面 reduce 中 and 操作的例子:

  1. @Test
  2. public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess(){
  3. List<Predicate<String>> allPredicates = new ArrayList<Predicate<String>>();
  4. allPredicates.add(str -> str.startsWith("A"));
  5. allPredicates.add(str -> str.contains("d"));
  6. allPredicates.add(str -> str.length() > 4);
  7. List<String> result = names.stream()
  8. .filter(allPredicates.stream().reduce(x->true, Predicate::and))
  9. .collect(Collectors.toList());
  10. assertEquals(1, result.size());
  11. assertThat(result, contains("Alexander"));
  12. }

注意这里初始条件是 true (如果初始条件为 false ,后续即使都满足,和初始值一起 and ,也没结果)

然后看 reduce 中使用 or 操作的例子:

  1. @Test
  2. public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess(){
  3. List<String> result = names.stream()
  4. .filter(allPredicates.stream().reduce(x->false, Predicate::or))
  5. .collect(Collectors.toList());
  6. assertEquals(2, result.size());
  7. assertThat(result, contains("Adam","Alexander"));
  8. }

Predicate::or 操作,通常会将初始值设置为 false,因为如果初始值为 true 不管后续条件是否为 true 最终结果都为 true。

7. 结论

本文介绍Java 8 Predicate。介绍了 Predicate在Stream的filter函数中的运用。讲述了复杂的Predicate或者Predicate的组合的用法。

英文原文:https://www.baeldung.com/java-predicate-chain

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/358247?site
推荐阅读
相关标签
  

闽ICP备14008679号