前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Java 8 Predicate花样用法

Java 8 Predicate花样用法

作者头像
明明如月学长
发布2021-08-31 16:08:06
发布2021-08-31 16:08:06
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

1. 简介

本文介绍Java 8 Predicate链.

2. 基本用法

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

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterList_thenSuccess(){
   List names = Arrays.asList("Adam", "Alexander", "John", "Tom");
   List result = names.stream()
     .filter(name -> name.startsWith("A"))
     .collect(Collectors.toList());
    
   assertEquals(2, result.size());
   assertThat(result, contains("Adam","Alexander"));
}

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

代码语言:javascript
代码运行次数:0
复制
name -> name.startsWith("A")

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

3. 多条件过滤

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithMultipleFilters_thenSuccess(){
    List result = names.stream()
      .filter(name -> name.startsWith("A"))
      .filter(name -> name.length() < 5)
      .collect(Collectors.toList());
 
    assertEquals(1, result.size());
    assertThat(result, contains("Adam"));
}

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

4. 复杂条件

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithComplexPredicate_thenSuccess(){
    List result = names.stream()
      .filter(name -> name.startsWith("A") && name.length() < 5)
      .collect(Collectors.toList());
 
    assertEquals(1, result.size());
    assertThat(result, contains("Adam"));
}

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

5. 组合使用Predicate

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

5.1. Predicate.and()

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess(){
    Predicate predicate1 =  str -> str.startsWith("A");
    Predicate predicate2 =  str -> str.length() < 5;
   
    List result = names.stream()
      .filter(predicate1.and(predicate2))
      .collect(Collectors.toList());
         
    assertEquals(1, result.size());
    assertThat(result, contains("Adam"));
}

两个条件都要满足

5.2. Predicate.or()

满足其中一个即可

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess(){
    Predicate predicate1 =  str -> str.startsWith("J");
    Predicate predicate2 =  str -> str.length() < 4;
     
    List result = names.stream()
      .filter(predicate1.or(predicate2))
      .collect(Collectors.toList());
     
    assertEquals(2, result.size());
    assertThat(result, contains("John","Tom"));
}

5.3. Predicate.negate()

将此条件取反

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

相当于

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

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess(){
    Predicate predicate1 =  str -> str.startsWith("J");
    Predicate predicate2 =  str -> str.length() < 4;
     
    List result = names.stream()
      .filter(predicate1.or(predicate2.negate()))
      .collect(Collectors.toList());
     
    assertEquals(3, result.size());
    assertThat(result, contains("Adam","Alexander","John"));
}

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

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCombinedPredicatesInline_thenSuccess(){
    List result = names.stream()
      .filter(((Predicate)name -> name.startsWith("A"))
      .and(name -> name.length()<5))
      .collect(Collectors.toList());
 
    assertEquals(1, result.size());
    assertThat(result, contains("Adam"));
}

6. 组合Predicates集合

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess(){
    List> allPredicates = new ArrayList>();
    allPredicates.add(str -> str.startsWith("A"));
    allPredicates.add(str -> str.contains("d"));        
    allPredicates.add(str -> str.length() > 4);
     
    List result = names.stream()
      .filter(allPredicates.stream().reduce(x->true, Predicate::and))
      .collect(Collectors.toList());
     
    assertEquals(1, result.size());
    assertThat(result, contains("Alexander"));
}

注意这里初始条件是true

如果是false则不同:

代码语言:javascript
代码运行次数:0
复制
@Test
public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess(){
    List result = names.stream()
      .filter(allPredicates.stream().reduce(x->false, Predicate::or))
      .collect(Collectors.toList());
     
    assertEquals(2, result.size());
    assertThat(result, contains("Adam","Alexander"));
}

7. 结论

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 基本用法
  • 3. 多条件过滤
  • 4. 复杂条件
  • 5. 组合使用Predicate
    • 5.1. Predicate.and()
    • 5.2. Predicate.or()
    • 5.3. Predicate.negate()
    • 5.4. 内联的方式组合使用Predicates
  • 6. 组合Predicates集合
  • 7. 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档