一、基础语法
形态一:匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
runnable.run();
形态二:完整的Lambda表达式
口诀:复制小括号,写死右箭头,落地大括号
本质:基于匿名内部类创建的对象
BiFunction<String, Integer, Double> function = (String t, Integer u) -> {
return 200.00d;
};
形态三:省略参数类型
BiFunction<String, Integer, Double> function = (t, u) -> {
return 200.00d;
};
形态四:省略大括号和return关键字
如果Lambda体中只有一行代码,那么Lambda体的大括号和return关键字都可以省略。
BiFunction<String, Integer, Double> function = (t, u) -> 200.00d;
形态五:省略小括号
如果Lambda表达式的参数部分只有一个参数,那么小括号可以省略。
Consumer<String> consumer = userName -> System.out.println("hello,"+userName);
二、函数式接口
1、概念
只有一个抽象方法的接口。
2、分类
接口名 | 类型 | 抽象方法 |
Consumer<T> | 消费型接口 | void accept(T t); |
Supplier<T> | 供给型接口 | T get(); |
Function<T, R> | 函数型接口 | R apply(T t); |
Predicate<T> | 断言型接口 | boolean test(T t); |
三、方法引用
情况一:对象调用非静态方法
多个参数举例:
BiConsumer<String, Integer> object =
(userName, userId) -> System.out.println(userName + " " + userId);
// 外界传入的参数,按顺序依次传入即可,要求一一对应
BiConsumer<String, Integer> lambda = object :: accept;
lambda.accept("tom", 5566);
情况二:类调用静态方法
@Test
public void test06() {
BiConsumer<String, Integer> consumer = LambdaTest::showMessage;
consumer.accept("jerry", 6688);
}
public static void showMessage(String userName, Integer userId) {
System.out.println(userName + " " + userId);
}
情况三:类::非静态方法
// Lambda 表达式:int compare(T o1, T o2);两个参数
// 方法引用原版:public int compareTo(String anotherString)一个参数
// 方法引用对应关系:o1.compareTo(o2)
// 方法引用最终写法:String::compareTo
Comparator<String> comparator = String::compareTo;
int compareResult = comparator.compare("a", "b");
System.out.println("compareResult = " + compareResult);