Java 8-lambda表达式及方法引用
Lambda表达式
Lambda表达式是一个类似于匿名函数的语法糖,它实现一个函数式接口,它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。
一个 Lambda 表达式可以有零个或多个参数
参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)
与(a)
效果相同
所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b)
或 (int a, int b)
或 (String a, int b, float c)
空圆括号代表参数集为空。例如:() -> 42
当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
Lambda 表达式的主体可包含零条或多条语句
如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。
匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。
什么是函数式接口
在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口。
每个 Lambda 表达式都能隐式地赋值给函数式接口,例如,我们可以通过 Lambda 表达式创建 Runnable 接口的引用。
Runnable r = () -> System.out.println("hello world");
当不指明函数式接口时,编译器会自动解释这种转化:
new Thread( () -> System.out.println("hello world") ).start();
因此,在上面的代码中,编译器会自动推断:根据线程类的构造函数签名,
public Thread(Runnable r) { }
将该 Lambda 表达式赋给 Runnable 接口
以下是一些 Lambda 表达式及其函数式接口:
四大核心函数式接口
public void testCoreInter(){ /** * @name 消费型接口 * @use Consumer<T> * @param T 传入参数 * @fun 接受一个参数 无返回值 * */ Consumer<String> con=(str)->System.out.println(str); con.accept("我是消费型接口!"); /** * @name 供给型接口 * @use Supplier<R> * @param R 返回值类型 * @fun 无参数 有返回值 * */ Supplier<Date> supp=()-> new Date(); Date date=supp.get(); System.out.println("当前时间:"+date); /** * @name 函数型接口 * @use Function<T,R> * @param T 传入参数 * @return R 返回值类型 * @fun 接受一个参数 有返回值 * */ Function<String, String> fun=(str)->"hello,"+str; String str=fun.apply("张俊强"); System.out.println(str); /** * @name 断定型接口 * @use Predicate<T> * @param T 传入参数 * @return Boolean 返回一个Boolean型值 * @fun 接受一个参数 返回Boolean型值 * */ Predicate<Integer> pre=(num)->num>0; Boolean flag=pre.test(10); System.out.println(flag); } --------------------- 来源:**** 原文:https://blog.****.net/zjq_1314520/article/details/73556167
自定义函数式接口
@FunctionalInterface public interface WorkerInterface { void doSomeWork(); }
函数式接口中允许定义默认方法和静态方法。
方法引用
(注意:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!)
-
构造器引用
Class::new(类名::new)
注意:构造器的参数列表,需要与函数式接口参数列表保持一致。(如Supplier函数式接口对应无参数构造器)
-
方法引用
-
静态方法引用;
Class::static_method(类名::静态方法)
-
实例方法引用;
instance::method(实例名:方法)
-
数组引用
类型[]::new
...