JDK 1.8开始为了方便用户开发专门提供了一个新的包:java.util.function,这个包中为lambda表达式和方法引用的提供目标类型。每个内建函数式接口都有一个抽象方法,称为功能接口的功能方法,lambda表达式的参数和返回类型与之匹配或调整。

java.util.function包之中最为核心的只有四个接口:

  • 功能型接口:Function
  • 消费型接口:Consumer
  • 供给型接口:Supplier
  • 断言型接口:Predicate

由于内建的函数式接口提供,所以让开发标准进行了统一,也就是说日后的用户不再需要自己去开发函数式接口,而直接使用已经提供好的接口进行函数式编程(Lamda编程)。

功能型接口:Function

在功能型接口中,通常有参数和返回值,本次引用String类的toUpperCase()方法,通过接受String类型来转换成大写,再返回String类型数据。

1
2
3
//1.功能型接口 有参数和返回值 Function
Function<String, String> func = String :: toUpperCase ;
System.out.println(func.apply("Hello Wolrd!"));

消费型接口 Consumer

在消费型接口中,通常有参数而没有返回值,本次使用消费型接口,引用System.out.println()这个方法,只接收数据但是没有返回值

1
2
3
//2.消费型接口 只有参数没有返回值 Consumer
Consumer<String> consumer = System.out::println;
consumer.accept("Hello Wolrd!");

供给型接口 Supplier

在消费型接口中,通常接口的方法没有参数,但是却可以返回数据。本次使用String类的isEmpty()方法。

1
2
3
4
//3.供给型 没有参数但是有返回值 Supplier
String str = "Hello World!" ;
Supplier<Boolean> supplier = str :: isEmpty ;
System.out.println(supplier.get());

断言型接口 Predicate

在断言型接口中,通常是用于一个判断的操作。本次引用String类中的matches()方法。

1
2
3
4
//4.断言型接口 Predicate 是一个判断操作
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;

/**
* Created by duliu on 12/8/2017.
*
* 内建函数式接口演示
*/
public class FunctionalInterfaces {

public static void main(String [] args){
//1.功能型接口 有参数和返回值 Function
Function<String, String> func = String :: toUpperCase ;
System.out.println(func.apply("Hello Wolrd!"));

//2.消费型接口 只有参数没有返回值 Consumer
Consumer<String> consumer = System.out::println;
consumer.accept("Hello Wolrd!");

//3.供给型 没有参数但是有返回值 Supplier
String str = "Hello World!" ;
Supplier<Boolean> supplier = str :: isEmpty ;
System.out.println(supplier.get());

//4.断言型接口 Predicate 是一个判断操作
String string = "Hello!" ;
Predicate<String> predicate = string :: matches ;
System.out.println(predicate.test("^\\S+$"));

}

}

运行结果:

1
2
3
4
HELLO WOLRD!
Hello Wolrd!
false
true