JDK1.8函数式接口Function、Consumer、Predicate、Supplier
1. 函数式接口定义
函数式接口(Functional Interface):有且仅有一个抽象方法的接口,但可以有多个非抽象方法的接口
函数式接口,即适用于函数式编程场景的接口,可以被隐式转换为Lambda表达式来表示接口的一个实现;jdk8以前是使用匿名类实现的。
示例:jdk1.8 使用注解@FunctionalInterface注解表示一个函数式接口
package com.agger.springbootfunction.function;
/**
* @classname: IHello
* @description: 函数式接口(只有一个抽象接口),使用@FunctionalInterface注解表示
* @author chenhx
* @date 2019-11-27 10:22:23
*/
@FunctionalInterface
public interface IHello {
public void sayHello(String name);
}
示例: jdk1.8 之前使用匿名类方式来调用函数式接口
/**
* @Title: test1
* @Description: jdk1.8 之前使用匿名类方式来调用函数式接口
* @author chenhx
* @date 2019-11-27 10:33:50
*/
@Test
void test1() {
IHello hello = new IHello() {
@Override
public void sayHello(String name) {
System.out.println("hello " + name);
}
};
hello.sayHello("张三");
}
示例: jdk1.8 之后可以使用lambda表达式隐式的实现函数式接口
/**
* @Title: test2
* @Description: jdk1.8 后可以使用lambda表达式隐式的实现函数式接口
* @author chenhx
* @date 2019-11-27 10:47:02
*/
@Test
void test2() {
IHello hello = name -> System.out.println("hello " + name);
hello.sayHello("李四");
}
2. jdk1.8 新增的函数式接口
jdk1.8之前,已有的函数式接口有很多, 参考 菜鸟教程:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
jdk1.8之后新增的一个重要的函数接口:
- java.util.function
此包下有很多类来支持java的函数式编程, 现在就讲到本篇文章的重点, 其中重要的四个接口Function、Consumer、Predicate、Supplier。
接口 | 参数 | 返回值 | 说明 |
---|---|---|---|
Supplier | 无 | T | 供给型;无参,返回一个指定泛型的对象 |
Consumer | T | 无 | 消费型;传入一个指定泛型的参数,无返回值 |
Predicate | T | Boolean | 断言型;判断函数,返回判断结果true/false |
Function<T,R> | T | R | 方法型;输入一个参数,得到一个结果 |
3. Supplier:供给型函数式接口
使用场景:提前定义可能返回的一个指定类型结果,等需要调用的时候再获取结果。
/**
* @Title: test3
* @Description: Supplier供给型函数式接口
* @author chenhx
* @date 2019-11-27 13:21:00
*/
@Test
void test3(){
// 示例1
int num1 = 100;
int num2 = 200;
// 提前定义好需要返回的指定类型结果,但不运行
Supplier<Integer> supplier= () -> num1 + num2;
// 调取get()方法获取一个结果
System.out.println(supplier.get());
// 示例2
String str = "abcdefghijklmn";
String s = getValue(()->str.substring(1,5));
System.out.println(s);
}
// 定义一个方法,返回一个结果,参数使用Supplier,具体返回内容由调用者决定
public static String getValue(Supplier<String> supplier){
return supplier.get();
}
注意:此示例中返回的结果引用的对象num1和