Java的Lambda表达式
Lambda式是什么?
这是在Java8中引入的一种写法。
同样,在Java8中引入的Stream API是基于使用Lambda表达式的,因此学习Lambda表达式可能会有一些好处。
另外,使用lambda表达式还存在一个好处,即可以简洁地描述使用匿名类的函数式接口。
如何编写lambda表达式
Lambda表达式的基本书写方式如下。
インターフェース名 オブジェクト名 = 引数(複数受け取れる) -> 処理;
由于编译器可以进行类型推断,所以不需要指定参数的类型。
当只有一个参数时,不需要使用return或用括号()括住参数,也不需要书写代码块{}。
※修正
只有当{}中只有一条return语句时,才可以省略{}和return。
参数的数量不重要。
使用匿名类进行实现
通过使用lambda表达式,可以简洁明了地编写代码,而无需使用匿名类。
假设有一个类似以下的匿名类。
interface InterfaceTest{
// 抽象メソッド
public String name(String name);
}
public class Main {
public static void main(String[] args) {
// 匿名クラスを使った書き方
InterfaceTest greeting = new InterfaceTest() {
// オーバーライド
public String name(String name) {
return "Hello " + name;
}
};
System.out.println(greeting.name("momoji"));
}
}
在上述中,看起来好像是在创建接口的实例,但实际上是在创建一个具有匿名类的实例,该匿名类拥有该接口。
结果如下 ↓
Hello momoji
使用Lambda表达式进行实现。
我会尝试用Lambda表达式来重新改写这个。
interface InterfaceTest{
// 抽象メソッド
public String name(String name);
}
public class Main {
public static void main(String[] args) {
// ラムダ式を使った書き方
InterfaceTest greeting = (name) -> {
return "Hello " + name;
};
System.out.println(greeting.name("momoji"));
}
}
在{}中,写下了通过greeting方法执行的处理内容。
变得更简短,更易于理解正在进行什么操作。同时,不再需要指定参数的类型。
执行结果↓
Hello momoji
使用lambda表达式以更简洁的方式编写forEach循环
在Java中,有一种与for-each循环具有相同性质的结构,称为增强型for循环。它具有对数组或列表的所有元素执行指定操作的性质。
for循环的写法。
for (データ型 変数名: listや配列){
処理;
...
}
要输出列表的所有元素,请使用扩展for循环,写成以下方式。
main.java
class Main {
public static void main (String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 拡張for文
for(String l : list) {
System.out.println(l);
}
}
}
在上面的例子中,
1. 定义一个String类型的列表”list”。
2. 使用add方法将”a”、”b”、”c”的元素逐个添加到list中。
3. 使用增强for循环逐个输出list的元素。
我正在做的事情是这样的。
执行结果如下所示。
a
b
c
使用Lambda表达式和forEach语句可以将其缩短。
class Main {
public static void main (String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 拡張for文
// for(String l : list) {
// System.out.println(l);
// }
// ラムダ式を使ったforEach文
list.forEach(l -> System.out.println(l));
}
}
执行结果↓
a
b
c
使用方法引用,可以将原本需要3行写的内容压缩到1行。
方法引用是指对方法的引用或指向。
从Java8开始,也引入了这种语法。
方法引用是指可以将方法作为参数传递的机制。
您可以无需参数调用预定义的方法。
方法引用的写法如下所示。
クラス名 :: メソッド名
在类名后面加上”::”,写上想要调用的方法名。方法名不需要加上()。
我們立即嘗試將lambda表達式與其結合起來。
// メソッド参照を使ったラムダ式
list.forEach(System.out::println);
执行结果↓
a
b
c
使用Lambda表达式和方法引用的组合技术,使得代码能够更简洁地编写。