从JDK 1.8开始为了方便用户开发专门提供了一个新的包:java.util.function,这个包中为lambda表达式和方法引用的提供目标类型。每个内建函数式接口都有一个抽象方法,称为功能接口的功能方法,lambda表达式的参数和返回类型与之匹配或调整。
在java.util.function包之中最为核心的只有四个接口:
- 功能型接口:Function
- 消费型接口:Consumer
- 供给型接口:Supplier
- 断言型接口:Predicate
由于内建的函数式接口提供,所以让开发标准进行了统一,也就是说日后的用户不再需要自己去开发函数式接口,而直接使用已经提供好的接口进行函数式编程(Lamda编程)。
功能型接口:Function
在功能型接口中,通常有参数和返回值,本次引用String类的toUpperCase()方法,通过接受String类型来转换成大写,再返回String类型数据。
1 2 3
| Function<String, String> func = String :: toUpperCase ; System.out.println(func.apply("Hello Wolrd!"));
|
消费型接口 Consumer
在消费型接口中,通常有参数而没有返回值,本次使用消费型接口,引用System.out.println()这个方法,只接收数据但是没有返回值
1 2 3
| Consumer<String> consumer = System.out::println; consumer.accept("Hello Wolrd!");
|
供给型接口 Supplier
在消费型接口中,通常接口的方法没有参数,但是却可以返回数据。本次使用String类的isEmpty()方法。
1 2 3 4
| String str = "Hello World!" ; Supplier<Boolean> supplier = str :: isEmpty ; System.out.println(supplier.get());
|
断言型接口 Predicate
在断言型接口中,通常是用于一个判断的操作。本次引用String类中的matches()方法。
1 2 3 4
| String string = "Hello!" ; Predicate<String> predicate = string :: matches ; System.out.println(predicate.test("^\\S+$"));
|
示例代码
File : FunctionalInterfaces.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.devnp;
import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier;
public class FunctionalInterfaces {
public static void main(String [] args){ Function<String, String> func = String :: toUpperCase ; System.out.println(func.apply("Hello Wolrd!"));
Consumer<String> consumer = System.out::println; consumer.accept("Hello Wolrd!");
String str = "Hello World!" ; Supplier<Boolean> supplier = str :: isEmpty ; System.out.println(supplier.get());
String string = "Hello!" ; Predicate<String> predicate = string :: matches ; System.out.println(predicate.test("^\\S+$"));
}
}
|
运行结果:
1 2 3 4
| HELLO WOLRD! Hello Wolrd! false true
|
Author:
Darren Du
License:
Copyright (c) 2019 MIT LICENSE