Java中的lambda表达式和函数式接口应用
Java中的lambda表达式和函数式接口是Java 8之后引入的新特性,它们可以使Java程序更简洁、更易读、更高效。本文将分别介绍这两个特性,并且带有应用实例。
一、lambda表达式
lambda表达式是Java 8引入的一种轻量级的匿名函数,它可以传递方法作为参数。它的形式如下:
(parameters) -> expression
或者
(parameters) -> { statements; }
parameters:参数列表,可以为空或包含一个或多个参数。
->:符号,用来分隔参数列表和lambda表达式体。
expression或{ statements; }:lambda表达式的实现体,可以是表达式或一系列表达式的语句块。
示例:
普通方式:
public class Test {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
}).start();
}
}
lambda方式:
public class Test {
public static void main(String[] args) {
new Thread(() -> System.out.println("Hello World!")).start();
}
}
这里通过lambda表达式实现了Runnable接口,避免了代码冗长。
二、函数式接口
函数式接口是一种只包含一个抽象方法的接口。Java 8中提供了一些函数式接口,如Function、Consumer、Predicate等,这些接口都有一个特点,就是只包含一个抽象方法。这些接口提供了一种通用的模式,使得开发者可以在不同的场景下使用函数式接口,从而简化代码实现和提升代码可读性。示例:
普通方式:
public interface MyFilter {
boolean filter(Integer num);
}
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> newList = new ArrayList<>();
MyFilter myFilter = new MyFilter() {
@Override
public boolean filter(Integer num) {
return num % 2 == 0;
}
};
for (Integer num : list) {
if (myFilter.filter(num)) {
newList.add(num);
}
}
System.out.println(newList);
}
}
lambda方式:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> newList = new ArrayList<>();
list.stream().filter(num -> num % 2 == 0).forEach(newList::add);
System.out.println(newList);
}
}
这里通过Java8中提供的函数式接口Predicate和Stream完成了过滤功能。
三、lambda表达式和函数式接口的应用
1. lambda表达式实现排序
普通方式:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(4, 2, 1, 3, 5));
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
System.out.println(list);
}
}
lambda方式:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(4, 2, 1, 3, 5));
Collections.sort(list, (o1, o2) -> o1 - o2);
System.out.println(list);
}
}
2. lambda表达式实现多线程
普通方式:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread is running!");
}
}
public class Test {
public static void main(String[] args) {
new MyThread().start();
}
}
lambda方式:
public class Test {
public static void main(String[] args) {
new Thread(() -> System.out.println("LambdaThread is running!")).start();
}
}
3. lambda表达式实现forEach
普通方式:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
for (Integer num : list) {
System.out.println(num);
}
}
}
lambda方式:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(num -> System.out.println(num));
}
}
结语
lambda表达式和函数式接口是Java中非常实用的特性,在Lambda表达式中传递的函数式接口可以提高代码的简洁性和可读性,同时引发更深层次的思考。在实际开发过程中,合理运用这些特性,使得代码更简单、高效,会大大提高个人及团队的开发效率。
