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>