Java 1.8 Stream 流 Match 元素匹配

更新时间 2023-07-25 10:43:58

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

在 Java 1.8 中,Stream API 提供了 allMatch()anyMatch()noneMatch() 方法 用于对流中的元素进行匹配操作。这些方法可以帮助我们快速判断流中的元素是否满足某个条件,从而返回一个布尔值。

本小节将深入介绍 Java 1.8 中的 Stream 的 match 方法,并通过示例代码演示如何使用它们。

match 方法概览

在 Stream API 中,match 方法用于判断流中的元素是否满足某个条件。

boolean allMatch(Predicate<? super T> predicate)
boolean anyMatch(Predicate<? super T> predicate)
boolean noneMatch(Predicate<? super T> predicate)
  • allMatch() 方法用于判断流中的所有元素是否都满足指定的条件。
  • anyMatch() 方法用于判断流中的任意元素是否满足指定的条件。
  • noneMatch() 方法用于判断流中的所有元素是否都不满足指定的条件。

使用 match 方法

让我们通过几个示例来说明如何使用 match 方法。

示例 1:判断列表中是否所有元素都大于 10

List<Integer> numbers = Arrays.asList(12, 15, 18, 9, 11);

// 使用 allMatch() 方法判断列表中是否所有元素都大于 10
boolean allGreaterThanTen = numbers.stream()
                                   .allMatch(num -> num > 10);

System.out.println("All elements greater than 10: " + allGreaterThanTen); // 输出 "All elements greater than 10: false"

在这个例子中,我们首先创建一个整数列表 numbers。然后,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 allMatch() 方法判断列表中是否所有元素都大于 10。

示例 2:判断列表中是否有元素等于 15

List<Integer> numbers = Arrays.asList(12, 15, 18, 9, 11);

// 使用 anyMatch() 方法判断列表中是否有元素等于 15
boolean hasElementFifteen = numbers.stream()
                                   .anyMatch(num -> num == 15);

System.out.println("Has element equals to 15: " + hasElementFifteen); // 输出 "Has element equals to 15: true"

在这个例子中,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 anyMatch() 方法判断列表中是否有元素等于 15。

示例 3:判断列表中是否没有元素小于 0

List<Integer> numbers = Arrays.asList(12, 15, 18, 9, 11);

// 使用 noneMatch() 方法判断列表中是否没有元素小于 0
boolean noneLessThanZero = numbers.stream()
                                  .noneMatch(num -> num < 0);

System.out.println("None element less than 0: " + noneLessThanZero); // 输出 "None element less than 0: true"

在这个例子中,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 noneMatch() 方法判断列表中是否没有元素小于 0。

自定义条件

在使用 allMatch()anyMatch()noneMatch() 方法时,你可以根据需要自定义条件,对流中的元素进行更复杂的匹配判断。自定义条件需要传入一个实现了 Predicate 接口的匿名函数或 Lambda 表达式。

示例:自定义条件

假设我们有一个字符串列表,现在想要判断列表中的字符串是否都包含小写字母。

List<String> words = Arrays.asList("apple", "Banana", "cherry");

// 使用 allMatch() 方法自定义条件,判断列表中的字符串是否都包含小写字母
boolean allContainLowerCase = words.stream()
                                  .allMatch(word -> word.matches(".*[a-z].*"));

System.out.println("All words contain lower case: " + allContainLowerCase); // 输出 "All words contain lower case: false"

在这个例子中,我们使用 stream() 方法将字符串列表转换为 Stream 对象,再使用 allMatch() 方法自定义条件,判断列表中的字符串是否都包含小写字母。matches(".*[a-z].*") 是一个正则表达式,用于判断字符串中是否包含小写字母。因此,这里的自定义条件是判断字符串是否都包含小写字母。

你可以根据实际需求编写更复杂的自定义条件,如判断字符串是否满足特定的格式、对象是否满足特定的属性要求等等。

总结

Java 1.8 中的 Stream API 提供了 allMatch()anyMatch()noneMatch() 方法,用于对流中的元素进行匹配判断。通过使用这些方法,你可以快速判断流中的元素是否满足某个条件,并得到一个布尔值。