概述
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
JDK1.8之后引入的一种语法,他的写法是使用一个->
符号,箭头将Lambda表达式分为左右两部分,左边写的是实现的这个接口中的抽象方法中的形参列表,右边就是对抽象方法的处理;
实现的这个接口中的抽象方法中的形参列表 -> 抽象方法的处理
lambda表达式没有名称,因为它表示匿名内部类。
lambda表达式的返回类型由编译器推断。
lambda表达式不能像方法一样有throws子句。
lambda表达式不能是泛型,而泛型在函数接口中定义。
使用方法
实例1
以下代码使用单一方法创建接口,并将其用作lambda表达式类型。当创建lambda表达式时,我们声明参数s1
的类型为Integer
类型。
public class Main {
public static void main(String[] args) {
MyIntegerCalculator myIntegerCalculator = (Integer s1) -> s1 * 2;
System.out.println("1- Result x2 : " + myIntegerCalculator.calcIt(5));
}
}
interface MyIntegerCalculator {
public Integer calcIt(Integer s1);
}
上面的代码生成以下结果。
实例2
这里是没有使用类型的演示。当忽略类型时,编译器必须计算出来。
public class Main {
public static void main(String[] args) {
MyIntegerCalculator myIntegerCalculator = (s1) -> s1 * 2;
System.out.println (myIntegerCalculator.calcIt(5));
}
}
interface MyIntegerCalculator {
public Integer calcIt(Integer s1);
}
上面的代码生成以下结果。
实例3
省略参数类型,如果选择省略参数类型,那么应该省略全部,不能部分省略。编译器根据上下文自动推断参数类型。
(x, y) -> { return x + y; }
实例4
对于单参数类型,可以省略括号
(msg)->{System.out.println(msg);}
msg -> { System.out.println(msg); }
实例5
对于没有参数的表达式,仍然需要括号
特殊说明 函数式
函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程。
一种典型的函数式接口如下:
Function 是种接受单个参数并返回结果的函数式接口.
一个典型的 Function
的实例化示例如下:
Function strLen = new Function<>() {
@Override
public Integer apply(String t) {
return t.length();
}
};
System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
在 Java 中, 可以通过ambda 表达式来实现各种函数式接口