目录
写在前面
一、常见写法
二、@FunctionalInterface注解
三、default方法
四、jdk8自带的函数接口(重点)
Predicate
Consumer
Function
Supplier
BiFunction
jdk提供了很多基本数据类型的类,可以直接使用不需要加泛型
实例
写在前面
本文主要是介绍jdk8自带的函数接口,默认认为读者已经了解或接触过lambda函数基础。
学习jdk8自带的函数接口,主要是为了进一步学习stream流式编程。
一、常见写法
interface Interface1 {
int doubleNum(int i);
}
public static void main(String[] args) {
Interface1 i1 = (i) -> i * 2;
Interface1 i2 = i -> i * 2;
Interface1 i3 = (int i) -> i * 2;
Interface1 i4 = (int i) -> {
System.out.println("-----");
return i * 2;
};
}
二、@FunctionalInterface注解
lambda表达式实现的接口,必须有且仅有一个要实现的方法,使用@FunctionalInterface注解标注之后,如果不符合lambda接口格式,会编译报错。
interface Interface1 {
int doubleNum(int i);
}
三、default方法
java8可以在接口中编写default默认实现的方法。
若两个接口,都有一个相同的名称、参数的default方法,两个接口被同一个类实现之后,这个类必须要重写这个default方法(编译期就会报错)。
interface Interface1 {
int doubleNum(int i);
default int add(int x, int y) {
return x + y;
}
}
四、jdk8自带的函数接口(重点)
Predicate
核心方法:
boolean test(T t);
输入一个任意类型的参数,输出一个boolean类型。
Consumer
核心方法:
void accept(T t);
输入一个任意类型的参数,无输出。
Function
核心方法:
R apply(T t);
输入一个任意类型的参数,输出一个任意类型的参数。
Supplier
核心方法:
T get();
无输入参数,输出一个任意类型的参数。
BiFunction
核心方法:
R apply(T t, U u);
输入两个参数,输出一个任意类型的参数。
jdk提供了很多基本数据类型的类,可以直接使用不需要加泛型
实例
import java.text.DecimalFormat;
import java.util.function.Function;
class MyMoney {
private final int money;
public MyMoney(int money) {
this.money = money;
}
// jdk8自带的接口,Integer为入参,String为出参
public void printMoney(Function<Integer, String> moneyFormat) {
System.out.println("我的存款:" + moneyFormat.apply(this.money));
}
}
public class MoneyDemo {
public static void main(String[] args) {
MyMoney me = new MyMoney(99999999);
Function<Integer, String> moneyFormat = i -> new DecimalFormat("#,###")
.format(i);
// 函数接口链式操作
me.printMoney(moneyFormat.andThen(s -> "人民币 " + s));
}
}
// 执行结果:
// 我的存款:人民币 99,999,999
public static void main(String[] args) {
// 断言函数接口
IntPredicate predicate = i -> i > 0;
System.out.println(predicate.test(-9));
// IntConsumer,jdk中自带一些基本数据类型的,就不需要写泛型了
// 消费函数接口
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("输入的数据");
}