1、Predicate<T>和Function<T, R>区别
Predicate<T>
和 Function<T, R>
是 Java 中常用的函数式接口,主要区别在于用途不同:Predicate<T>
用于判断条件,返回布尔值(true/false),而 Function<T, R>
用于将输入类型 T
转换为输出类型 R
,实现数据转换功能。
1) 返回值
Predicate<T>
返回必须是boolean类型,而Function<T, R>
中返回值是可以自己指定的R
类型。
2) 使用情景
Predicate<T>
是需要使用一个类型为T的参数,返回值为布尔值的函数时,如可以过滤Stream,从满足条件的Stream中找到第一个元素:.filter(predicate).findFirst()
,或者从满足某个条件的stream中检查元素的存在,anyMatch,noneMatch,allMatch等。
Function<T, R>
是当需要使用一个函数将一个T
类型参数转换为R
类型,例如调用stream.map(func)
。
2、Predicate<T>和Function<T, R>使用示例代码
Java 中的 Predicate<T>
是用于执行布尔条件判断的函数式接口,常用于 filter
操作;而 Function<T, R>
用于将输入类型 T
转换为输出类型 R
,常用于 map
映射操作。使用时需注意:Predicate
返回值必须是 boolean
,适合判断条件;Function
返回值可为任意类型,适合做类型转换。在实际开发中应根据用途合理选择,提升代码的可读性与函数式编程能力。
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Stream; public class PredicateExample { public static void main(String[] args) { // 一个字符串列表 List<String> stringList = Arrays.asList( "cjavapy", "JavaPredicateExample123", "StreamFilterDemo", "123456789012345678901" // 长度为21 ); // 定义 Predicate:判断字符串长度是否为 21 Predicate<String> predicate = p -> p.length() == 21; // 使用 Stream 和 filter 过滤出长度为 21 的字符串 Stream<String> stream = stringList.stream().filter(predicate); // 打印过滤结果 stream.forEach(System.out::println); } }
或者
import java.util.List; import java.util.function.Function; import java.util.stream.Stream; public class FunctionExample { public static void main(String[] args) { // 定义 Function:将字符串映射为布尔值,判断长度是否为 21 Function<String, Boolean> function = p -> p.length() == 21; // 示例字符串列表 List<String> strings = List.of( "cjavapy", "This string has exactly 21", // 长度不为21 "123456789012345678901" // 正好21个字符 ); // 使用 Function 映射成 Boolean 流 Stream<Boolean> stream = strings.stream().map(function); // 打印结果 stream.forEach(System.out::println); } }
相关文档:Predicate<T> 和 Function<T,R>