南瓜慢说官方网站

  • 首页
  • 所有文章
  • 容器技术
  • SpringBoot-Cloud
  • 程序人生
  • 其它
  • 整理
  • 关于

  • 搜索
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
技术之前,先读诗书:

Java 8之条件断言Predicate的使用

发表于 2019-10-05 | 分类于 Java基础 | 0 | 阅读次数 267

1 简介

Java 8引入了许多函数式接口Functional Interface,Predicate则是常用的一个。Predicate主要的方法为:

boolean test(T t);

它传入一个对象,并返回一个boolean值,这在stream中用得非常多,本文简单介绍它的基本用法。

2 基本用法

2.1 单一filter中的使用

List<String> names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
List<String> result = names.stream()
        .filter(name -> name.contains("m"))
        .collect(Collectors.toList());
assertEquals(3, result.size());
assertTrue(result.contains("Jeremy"));

代码中,name -> name.contains("m"),为Predicate,表示字符串包含m的才满足条件。

2.2 多个filter中的使用

names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(name -> name.startsWith("S"))
        .filter(name -> name.contains("m"))
        .collect(Collectors.toList());
assertEquals(2, result.size());
assertEquals(asList("Sam", "Simon"), result);

通过filter可以不断连接各种条件判断。

2.3 条件运算符组合使用

names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(name -> name.startsWith("S") && name.contains("m"))
        .collect(Collectors.toList());
assertEquals(2, result.size());
assertEquals(asList("Sam", "Simon"), result);

通过条件运算符&、|和!等实现与或非。

3 组合用法

3.1 与门and的使用

Predicate<String> startsWith_S = str -> str.startsWith("S");
Predicate<String> contains_m = str -> str.contains("m");
//and
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(startsWith_S.and(contains_m))
        .collect(Collectors.toList());
assertEquals(asList("Sam", "Simon"), result);

通过Predicate.and()方法,把两个条件组合起来,表示需要同时满足两个条件。

3.2 或门or的使用

//or
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(startsWith_S.or(contains_m))
        .collect(Collectors.toList());
assertEquals(asList("Jeremy", "Sam", "Simon"), result);

3.3 非门negeate的使用

//negate
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(startsWith_S.negate())
        .collect(Collectors.toList());
assertEquals(asList("Larry", "Jeremy", "Mike"), result);

3.4 多个合并使用

//Collection
Predicate<String> length_gt4 = str -> str.length() > 4;
List<Predicate<String>> allPredicates = asList(
        startsWith_S,
        contains_m,
        length_gt4
);
//and
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(allPredicates.stream().reduce(x -> true, Predicate::and))
        .collect(Collectors.toList());
assertEquals(singletonList("Simon"), result);

//or
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
        .filter(allPredicates.stream().reduce(x -> false, Predicate::or))
        .collect(Collectors.toList());
assertEquals(asList("Larry", "Jeremy", "Sam", "Simon"), result);

需要注意的是:

与逻辑的时候,开始为x -> true;

而或逻辑的时候,开始为x -> false。

总结

Predicate在Java 8中很常用,特别是在Optional和Stream等有filter时,需要灵活掌握其基本用法。


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

file

推荐阅读:
如何制定切实可行的计划并好好执行
容器技术(Docker-Kubernetes)
SpringBoot-Cloud相关
Https专题

  • 本文作者: 南瓜慢说
  • 本文链接: https://www.pkslow.com/archives/java8-predicate
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# 中间件 # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # 计划 # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # 性能 # Email # Springboot # 集合类 # ArrayList # Java
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
如何创建和初始化一个HashMap?
统计String单词数的三种方法
  • 文章目录
  • 站点概览
南瓜慢说

南瓜慢说

多年Java开发,主要专注后端技术:Java/Spring/Springboot/微服务/大数据等。

多读书,多分享;多写作,多整理。

151 日志
7 分类
27 标签
RSS
0%
© 2020 — 2021 南瓜慢说 本站已挣扎运行:   粤ICP备20036375号