在 Java 8 及以后的版本中,引入了许多函数式编程的特性,其中最重要的就是内置的函数式接口。这些接口使得编写更简洁、可读性更强的代码成为可能。今天我将介绍四个常用的内置接口:Predicate
、Function
、Consumer
和 Supplier
,并提供示例代码以帮助理解其用法。
1. Supplier 接口
Supplier<T>
是一个供给型接口,它没有输入参数,但会返回一个类型为 T
的对象。常用于需要延迟计算或生成对象的场景。
源码
示例
package com.school;import java.util.Arrays;
import java.util.function.Supplier;/*** 文件名: null.java* 作者: 20526* 创建时间: 2024/9/8 14:08* 描述:Supplier接口*/
public class SupplierDemo {public static void main(String[] args) {testSupplier(()->{int[] arr = {1, 2, 20, 4, 9};Arrays.sort(arr);return arr[arr.length - 1];});}/*** 供给型接口Supplier<T>的使用* 传入一个泛型参数T,返回类型为T的对象*/public static void testSupplier(Supplier<Integer> supplier) {int max = supplier.get();System.out.println("最大值: " + max);}
}
2. Consumer 接口
Consumer<T>
是一个消费型接口,它接受一个类型为 T
的输入参数,但没有返回值。常用于执行某些操作,例如打印或处理数据。
源码
示例
package com.school;import java.util.function.Consumer;/*** 文件名: null.java* 作者: 20526* 创建时间: 2024/9/8 14:14* 描述:Consumer接口*/
public class ConsumerDemo {public static void main(String[] args) {//Lambda表达式作省略写法testconsume( s-> System.out.println(s.toUpperCase()));// 使用匿名内部类实现Consumer接口testconsume(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s.toUpperCase());}});}/*** 消费型接口Consumer* 传入一个泛型T,没有返回值,用于消费数据*/public static void testconsume(Consumer<String> consumer) {System.out.println("a a a");consumer.accept("Hello World");}
}
3. Function 接口
Function<T, R>
是一个函数型接口,它接受一个类型为 T
的输入参数,并返回一个类型为 R
的结果。常用于转换数据类型或执行某些计算。
源码
示例
package com.school;import java.util.function.Function;/*** 文件名: null.java* 作者: 20526* 创建时间: 2024/9/8 14:30* 描述:Function接口*/
public class FunctionDemo {public static void main(String[] args) {getNumber( s -> Integer.parseInt(s));}public static void getNumber(Function<String, Integer> function) {Integer i = function.apply("123");System.out.println("i = "+i);}}
4. Predicate 接口
Predicate<T>
是一个断言型接口,它接受一个类型为 T
的输入参数,并返回一个布尔值。常用于过滤或测试条件。
源码
示例
package com.school;import java.util.function.Predicate;/*** 文件名: PredicateDemo.java* 作者: 20526* 创建时间: 2024/9/8 14:45* 描述: Predicate接口*/
public class PredicateDemo {public static void main(String[] args) {testPredicate(s -> s.length() > 5);}public static void testPredicate(Predicate<String> predicate) {String testString = "HelloWorld";boolean result = predicate.test(testString);System.out.println("字符串长度大于5: " + result);}
}
总结
Java 的内置函数式接口提供了强大的功能,使得开发者能够以更简洁的方式编写代码。通过 Supplier
、Consumer
、Function
和 Predicate
,我们可以轻松地实现延迟计算、数据处理、类型转换和条件判断。这些接口在 Java 8 的流式 API 中得到了广泛应用,极大地提升了代码的可读性和可维护性。希望对你有所帮助。