Java 中的箭头运算符 ->
Mohammad Irfan
2023年10月12日
本教程介绍了箭头运算符 (->
) 在 Java 中的作用,并列出了一些示例代码来理解该主题。
在 Java 8 中,增加了一个新特性 lambda 表达式,同时在 Java 中出现了箭头运算符,用于形成 lambda 表达式。它将参数与表达式主体分开。
(parameters) -> {
statements;
} // Lambda expression having arrow
Lambda 表达式是在 Java 8 中引入的,可以用来代替 Java 中的匿名类,使代码更加简洁和可读。
下面是我们如何在 Java 8 之前的 Java 中创建匿名类的示例。
Runnable r = new Runnable() {
@Override
public void run() {
System.out.print("Run method");
}
};
这就是我们如何在 Java 8 中使用 lambda 表达式来实现上述任务。
Runnable r = () -> System.out.print("Run method");
让我们从一些示例开始,以了解 lambda 和箭头运算符的使用。
Java 中箭头运算符的使用
在此示例中,我们使用箭头运算符创建了一个 lambda 表达式,该表达式实现了 Drawable
接口的 draw()
方法。请参考下面的示例。
interface Drawable {
public void draw();
}
public class Main {
public static void main(String[] args) {
int width = 20;
// arrow operator
Drawable d2 = () -> {
System.out.println("Drawing width: " + width);
};
d2.draw();
}
}
输出:
Drawing width: 20
由于 lambda 表达式是使用函数式方法创建简洁代码的一种超级方式,因此我们可以在 Java 代码中以多种方式使用它。让我们看一些我们可以应用它的例子。
Java 集合中的箭头运算符
在此示例中,我们使用 lambda 表达式过滤 ArrayList 数据。我们使用了流 API 和 filter() 方法来获得所需的结果。你会注意到,使用 lambda 创建代码比使用非 lambda 代码更容易。请参考下面的示例。
package javaexample;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
class Product {
int id;
String name;
float price;
public Product(int id, String name, float price) {
this.id = id;
this.name = name;
this.price = price;
}
}
public class Main {
public static void main(String[] args) {
List<Product> list = new ArrayList<Product>();
list.add(new Product(1, "Samsung S5", 17000));
list.add(new Product(3, "Iphone 12", 100500));
list.add(new Product(2, "Sony Xperia", 25000));
// using arrow to filter data
Stream<Product> filtered_data = list.stream().filter(p -> p.price > 17000);
filtered_data.forEach(product -> System.out.println(product.name + ": " + product.price));
}
}
输出:
Iphone 12: 100500.0
Sony Xperia: 25000.0
Java 线程中的箭头运算符
这是 lambda 表达式的另一种用法,我们用它来实现可运行接口的 run()
方法。由于 Runnable 是单个方法接口,因此很容易使用 lambda 表达式。请参考下面的示例。
package javaexample;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
// using arrow
Runnable r = () -> {
System.out.println("Thread is running...");
};
Thread t2 = new Thread(r);
t2.start();
}
}
输出:
Thread is running...