预定义的函数式接口

一、前面几篇文章的例子,都是自定义函数式接口。但是很多时候,并不需要自己定义函数式接口,因为JDK 8 中包含了新包 java.util.function,其中提供了一些预定义的函数式接口。
1、接口 UnaryOperator<T>,其抽象方法 apply(),对类型T的对象应用一元运算。
2、BinaryOperator<T>,其抽象方法apply(),对类型 T 的两个对象进行操作。
3、Consumer<T>,方法 accept(),对类型 T 的对象操作。
4、Supplier<T>,方法get(),返回类型为T的对象。
5、Function<T, R>,方法 apply(),操作类型为T的对象,并返回类型为R的对象。
6、Predicate<T>,方法test(),确定类型为T的对象是否满足某种约束,并返回boolean值。
### Java 函数式接口概述 函数式接口是指只包含一个抽象方法的接口。这类接口是 Java 8 引入的概念,旨在支持函数式编程风格,并允许通过 lambda 表达式来简化代码实现[^2]。 为了确保某个接口确实是函数式接口,在定义时可以使用 `@FunctionalInterface` 注解。此注解并非必需,但它能帮助开发者明确意图并让编译器验证接口是否满足单一抽象方法的要求[^3]。 ### 常见内置函数式接口及其用途 Java 提供了一些常用的预定义函数式接口: - **Consumer<T>**: 接受单个输入参数而不返回任何结果的操作。 - **Predicate<T>**: 接受单个输入参数并返回布尔值的结果判断逻辑。 - **Function<T, R>**: 接收 T 类型的对象作为输入,并转换成另一种类型 R 的对象输出。 - **Supplier<T>**: 不接受参数而提供某种类型的对象实例的方法。 这些接口通常应用于集合框架的数据流处理中,比如利用 Stream API 进行排序、过滤、映射等操作[^4]。 ### 自定义函数式接口示例 除了上述标准库提供的接口外,还可以创建自定义的函数式接口以适应特定需求。下面是一个简单的例子展示如何声明和使用这样的接口: ```java // 定义一个名为 Greeting 的函数式接口 @FunctionalInterface interface Greeting { void sayHello(String name); } public class Main { public static void main(String[] args) { // 使用 Lambda 表达式实现该接口 Greeting greet = (name) -> System.out.println("Hello " + name); // 调用接口中的唯一方法 greet.sayHello("World"); } } ``` 这段代码展示了如何定义一个带有单一抽象方法的接口以及怎样借助 lambda 表达式快速构建其实现方式。 ### 数据处理应用案例 当涉及到复杂的数据集变换任务时,函数式接口配合 Streams 可极大提高开发效率。例如,假设有一组整数列表需要筛选偶数值后再平方每项,则可按如下方式编写简洁高效的解决方案: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); List<Integer> squaredEvens = numbers.stream() .filter(n -> n % 2 == 0) // Predicate<T> .map(n -> n * n) // Function<T,R> .collect(Collectors.toList()); System.out.println(squaredEvens); // 输出 [4, 16, 36] ``` 这里运用了多个不同的函数式接口来完成一系列连续性的数据加工步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值