Java 中的 Predicate<T> 和 Function<T, R> 都是函数式接口,区别在于:Predicate<T> 用于进行布尔判断,返回 true 或 false,常用于过滤条件判断;而 Function<T, R> 用于将一个类型的输入转换为另一个类型的输出,常用于数据转换或映射操作。两者广泛应用于流处理(Stream API)中,分别对应过滤和映射等典型操作。本文主要介绍Java 8中,Predicate<T>和Function<T, R>之间的区别,以及使用的示例代码。

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>

推荐文档

相关文档

大家感兴趣的内容

随机列表