错误和挫折教训了我们,使我们比较地聪明起来了,我们的情就办得好一些。 毛泽东
Java8 新增了非常多的特性,Lambda语法就是其中之一:
-
Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用lambda表达式的一般语法是(Parameters) -> { Body },分隔参数和lambda表达式主体。
参数括在括号中,与方法相同,而lambda表达式主体是用大括号括起来的代码块。
注意
lambda表达式主体可以有局部变量,语句。我们可以在lambda表达式主体中使用break,continue和return。我们甚至可以从lambda表达式主体中抛出异常。
lambda表达式没有名称,因为它表示匿名内部类。
lambda表达式的返回类型由编译器推断。
lambda表达式不能像方法一样有throws子句。
lambda表达式不能是泛型,而泛型在函数接口中定义。
显式和隐式lambda表达式
未声明其参数类型的lambda表达式称为隐式lambda表达式。
显式lambda表达式是一个lambda表达式,它声明其参数的类型。
编译器将推断用于隐式lambda表达式的参数类型
例子
以下代码使用单一方法创建接口,并将其用作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("1- Result x2 : " + myIntegerCalculator.calcIt(5));
}
}
interface MyIntegerCalculator {
public Integer calcIt(Integer s1);
}
上面的代码生成以下结果。
省略参数类型
我们可以选择省略lambda表达式中的参数类型。
在lambda表达式 (int x, int y) -> { return x + y; }
声明的参数类型。
我们可以安全地重写lambda表达式,省略参数类型
(x, y) -> { return x + y; }
如果我们选择省略参数类型,我们必须省略所有参数的类型。
public class Main {
public static void main(String[] argv) {
Processor stringProcessor = (str) -> str.length();
String name = "Java Lambda";
int length = stringProcessor.getStringLength(name);
System.out.println(length);
}
}
@FunctionalInterface
interface Processor {
int getStringLength(String str);
}
上面的代码生成以下结果。
单参数
对于单个参数lambda表达式,我们可以省略括号,因为我们省略了参数类型。
lambda表达式 (String msg) -> {System.out.println(msg);}
有一切。
然后我们可以省略参数类型
(msg)->{System.out.println(msg);}
我们可以进一步省略参数类型和括号,如下所示。
msg -> { System.out.println(msg); }
public class Main {
public static void main(String[] argv) {
Processor stringProcessor = str -> str.length();
String name = "Java Lambda";
int length = stringProcessor.getStringLength(name);
System.out.println(length);
}
}
@FunctionalInterface
interface Processor {
int getStringLength(String str);
}
上面的代码生成以下结果。
无参数
对于没有参数的lambda表达式,我们仍然需要括号。
() -> { System.out.println("hi"); }
以下示例显示如何使用 BooleanSupplier
。
import java.util.function.BooleanSupplier;
public class Main {
public static void main(String[] args) {
BooleanSupplier bs = () -> true;
System.out.println(bs.getAsBoolean());
int x = 0, y= 1;
bs = () -> x > y;
System.out.println(bs.getAsBoolean());
}
}
上面的代码生成以下结果。
final修饰符
您可以在参数声明中为表达式lambda表达式使用 final
修饰符。
以下lambda表达式使用final修饰符。
(final int x, final int y) -> { return x + y; }
我们可以只使用一个修饰符如下。
(int x, final int y) -> {return x + y;}
public class Main {
public static void main(String[] argv) {
Processor stringProcessor = (final String str) -> str.length();
String name = "Java Lambda";
int length = stringProcessor.getStringLength(name);
System.out.println(length);
}
}
interface Processor {
int getStringLength(String str);
}
上面的代码生成以下结果。
Lambda表达式主体
lambda表达式主体可以是块语句或单个表达式。
块语句用大括号括起来,而单个表达式可以没有大括号。
在块语句中,我们可以使用 return
语句返回值。
以下lambda表达式使用块语句并使用 return
语句返回总和。
(int x, int y) -> { return x + y; }
下面的lambda使用了一个表达式:
(int x, int y) -> x + y
表达式不需要大括号。
lambda不必返回值。以下两个lambda表达式只是将参数输出到标准输出,不返回任何内容。
(String msg)->{System.out.println(msg);}// a block statement
(String msg)->System.out.println(msg) //an expression
例:
public class Main {
public static void main(String[] argv) {
Processor stringProcessor = (String str) -> str.length();
String name = "Java Lambda";
int length = stringProcessor.getStringLength(name);
System.out.println(length);
}
}
@FunctionalInterface
interface Processor {
int getStringLength(String str);
}
上面的代码生成以下结果。
如果我的文章对你的工作和学习有帮助的话,那么点击底部 喜欢作者。快来和我一起互动吧!
发表评论