Java8 Predicate花样用法详解

 更新时间:2022年03月01日 15:30:49   作者:明明如月学长  
本文主要介绍了Java 8 Predicate花样用法详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1. 简介

本文介绍Java 8 Predicate链.

2. 基本用法

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

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

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

name -> name.startsWith("A")

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

3. 多条件过滤

@Test
public void whenFilterListWithMultipleFilters_thenSuccess(){
    List<String> 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. 复杂条件

@Test
public void whenFilterListWithComplexPredicate_thenSuccess(){
    List<String> 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()

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

两个条件都要满足

5.2. Predicate.or()

满足其中一个即可

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

5.3. Predicate.negate()

将此条件取反

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

相当于

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

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

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

6. 组合Predicates集合

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

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

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

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

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

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

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

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

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

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

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

7. 结论

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

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

到此这篇关于Java 8 Predicate花样用法详解的文章就介绍到这了,更多相关Java 8 Predicate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP里的静态代理和动态代理用法详解

    Spring AOP里的静态代理和动态代理用法详解

    这篇文章主要介绍了 Spring AOP里的静态代理和动态代理用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 深入解析Java的Spring框架中的混合事务与bean的区分

    深入解析Java的Spring框架中的混合事务与bean的区分

    这篇文章主要介绍了Java的Spring框架中的混合事务与bean的区分,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • Java 数据结构与算法系列精讲之红黑树

    Java 数据结构与算法系列精讲之红黑树

    红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的
    2022-02-02
  • SpringBoot自定义定时任务的实现示例

    SpringBoot自定义定时任务的实现示例

    本文主要介绍了SpringBoot自定义定时任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 基于Java编写第一个区块链项目

    基于Java编写第一个区块链项目

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,下面这篇文章主要给大家介绍了基于Java实现区块链的相关资料,需要的朋友可以参考下
    2021-08-08
  • Java使用jni清屏功能的实现(只针对cmd)

    Java使用jni清屏功能的实现(只针对cmd)

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。这篇文章主要介绍了Java使用jni清屏功能的实现(只针对cmd) ,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • Java项目在Idea中开发遇到所有代码爆红的问题与解决办法

    Java项目在Idea中开发遇到所有代码爆红的问题与解决办法

    今天打开项目时发现idea竟然爆红,通过查找相关资料用于解决,下面这篇文章主要给大家介绍了关于Java项目在Idea中开发遇到所有代码爆红的问题与解决办法的相关资料,需要的朋友可以参考下
    2023-06-06
  • Spring框架基于注解开发CRUD详解

    Spring框架基于注解开发CRUD详解

    这篇文章主要为大家详细介绍了Spring框架基于注解开发CRUD,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Spring Boot处理全局统一异常的两种方法与区别

    Spring Boot处理全局统一异常的两种方法与区别

    这篇文章主要给大家介绍了关于Spring Boot处理全局统一异常的两种方法与区别,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现

    这篇文章主要为大家详细介绍了Java数据结构中KMP算法的原理与实现,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论