Java 1.8 Stream 流 Match 元素匹配

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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

在 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() 方法,用于对流中的元素进行匹配判断。通过使用这些方法,你可以快速判断流中的元素是否满足某个条件,并得到一个布尔值。