如何使用Java中的匿名函数?-Java匿名函数的使用指南
Java中的匿名函数(也称为Lambda表达式)是一种简洁、直接、灵活的方法定义方式,能够大幅简化代码,提高代码可读性和可维护性。本文将重点讨论Java中匿名函数的使用场景和示例。
一、Lambda表达式的语法
Lambda表达式的语法如下:
(parameters) -> expression
(parameters) -> { statements; }
其中,parameters是可选的参数列表,可以为空,也可以包含一个或多个参数。expression或者statements是Lambda表达式的主体部分,expression是一个单独的、可以返回某个值的表达式,statements是一段具有副作用的代码块。那么以下是一些示例:
// 不需要参数,返回值为 5 () -> 5 // 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 接受2个int型整数,返回他们的和 (int x, int y) -> x + y // 接受2个long型整数,返回他们的差 (long x, long y) -> x - y // 接收一个字符串,返回其长度 (String s) -> s.length() // 处理一个集合 List<String> list = new ArrayList<>(); list.stream().forEach(s -> System.out.println(s));
二、Lambda表达式的使用场景
Java的匿名函数已经成为Java 8中最大的亮点之一。Lambda表达式可应用于许多应用场景,如:
1.函数式接口
Java的Lambda表达式是基于函数式接口的,可以看作是函数接口的一种快捷方式。前面提到的语法形式就是Lambda表达式的一种简化写法。比如,以下是定义函数式接口的方式:
@FunctionalInterface
interface MyInterface {
void doSomething(int i);
}
那么之后我们可以使用Lambda表达式来实现该接口:
MyInterface myIntf = (i) -> { // Lambda表达式
System.out.println("Do something with " + i);
};
或者更简洁的写法:
MyInterface myIntf = i -> System.out.println("Do something with " + i);
2.函数集合类
Java8的java.util.function提供的函数集合类使得Lambda表达式能够轻松应用在很多集合类的操作上,如:
List和Map等集合类型的filter/map/reduce/collect等操作都支持Lambda表达式:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> newList = list.stream()
.filter(x - > x%2==0)
.map(x -> x*2)
.collect(Collectors.toList());
Map也支持并发处理:
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.forEach((k,v)->System.out.println(k +" "+v));
还可以对Stream进行并行处理,代码如下:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.parallelStream()
.filter(x -> x%2== 0)
.forEach(System.out::println);
3.GUI应用
JavaFX提供了丰富的API,一些界面回调的注册和处理都可以使用Lambda表达式来实现,如下:
public class HelloApplication extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Button btn = new Button("Say 'Hello World'");
btn.setOnAction(event -> System.out.println("Hello World!"));
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
三、Lambda表达式的注意事项
在使用Lambda表达式时,需要注意以下几点:
1. Lambda表达式应用于函数式接口。如果一个接口的定义不止一个抽象接口,则该接口不再是函数接口,Lambda表达式就不再适用。
2. Lambda表达式中的“->”是Lambda运算符,它将Lambda表达式中的参数和实现隔开。
3. 如果Lambda表达式中只有一个参数,则括号可以省略。但是,如果写了括号,括号不能省略。
4. 如果Lambda表达式中只有一行代码用于返回结果,则大括号的话,return关键字的话,和分号都可以省略。
5. Lambda表达式的类型推导,不必指定参数类型,主要是根据上下文推导出具体类型。
四、Lambda示例
以下是一个简单的Lambda表达式示例:
用Lambda表达式实现匿名方法:
public class App {
public static void main(String[] args) {
new Thread(new Runnable() { // 使用匿名类
@Override
public void run() {
System.out.println("Hello World!1");
}
}).start();
new Thread(() -> System.out.println("Hello World!2")).start(); // 使用Lambda表达式
}
}
以上代码中,两个线程的实现方式完全相同,只是一个使用的是匿名类,另一个使用的是Lambda表达式。
五、结论
Lambda表达式是Java语言中的一种重要特性,它可以简化编程中很多繁琐的操作,提高代码的可读性和可维护性。当然,Lambda表达式并非完全可以替代匿名内部类,匿名内部类仍然应用广泛。有时候需要更好的可读性和更高的可访问性,可以使用匿名内部类;对于简单的基于函数式接口的逻辑代码,则建议使用Lambda表达式。
