Java8新特性-Lambda表达式详解
概述
Java8引入了Lambda表达式,是为了让Java开发者能够更加方便地实现函数式编程。Lambda表达式基于函数式接口,可以用于替换掉匿名内部类的写法,并且可以让代码更加简洁明了。Lambda表达式在Java8中被广泛使用,我们需要深入了解Lambda表达式的语法和使用方式。
Lambda表达式的语法
Lambda表达式的语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
其中,parameters
表示形式参数,在Lambda表达式中可以不指定参数类型,由编译器自动推导。expression
或statements
则表示Lambda表达式的执行体,可以是一个表达式或多条语句。
示例
下面是一个使用Lambda表达式实现的简单的Java程序:
public class LambdaDemo {
public static void main(String[] args) {
// Lambda表达式可以作为一个参数传递给函数
printMessage(message -> System.out.println("Hello, " + message));
}
public static void printMessage(MessagePrinter printer) {
printer.printMessage("world");
}
// 函数式接口,只包含一个抽象方法
interface MessagePrinter {
void printMessage(String message);
}
}
该程序定义了一个函数式接口MessagePrinter
,该接口只包含一个抽象方法printMessage
。然后定义了一个printMessage
方法,该方法接收一个MessagePrinter
类型的参数,并调用该参数的printMessage
方法。最后在main
方法中,我们通过Lambda表达式的方式定义了一个MessagePrinter
类型的参数,然后将其传递给了printMessage
方法。
Lambda表达式的作用范围和变量捕获
Lambda表达式的作用范围和匿名内部类类似,可以访问外层类型的成员变量和方法参数,但是如果要访问一个局部变量,则必须保证该变量是final修饰的,或者是不可变的。这是因为Lambda表达式可能在一个线程中执行,而访问非final变量会导致数据竞争问题。
示例
下面是一个使用Lambda表达式的Java程序:
public class LambdaDemo {
public static void main(String[] args) {
int number = 10;
IntFunction<String> intToString = (i) -> number + " * " + i + " = " + (number * i);
System.out.println(intToString.apply(5));
}
interface IntFunction<T> {
T apply(int value);
}
}
在该程序中,我们定义了一个IntFunction
函数式接口,该接口包含一个抽象方法apply
。然后,我们定义了一个number
变量,接着使用Lambda表达式定义了一个参数为i
、结果为字符串类型的函数intToString
,该函数返回值为number + " * " + i + " = " + (number * i)
。最后,我们调用intToString
的apply
方法,并传递了一个参数5
,输出结果为10 * 5 = 50
。
Lambda表达式的方法引用
除了Lambda表达式,Java8还引入了方法引用,可以用来更加简便地调用一个已有的方法。
示例
下面是一个使用Lambda表达式和方法引用的Java程序:
import java.util.*;
import java.util.stream.Collectors;
public class LambdaDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "orange", "banana", "peach");
// 通过Lambda表达式实现排序
Collections.sort(list, (String a, String b) -> a.compareTo(b));
System.out.println(list);
// 使用方法引用实现排序
Collections.sort(list, String::compareTo);
System.out.println(list);
// 使用Lambda表达式实现过滤
List<String> filteredList = list.stream()
.filter((String s) -> s.startsWith("a"))
.collect(Collectors.toList());
System.out.println(filteredList);
// 使用方法引用实现排序
List<String> filteredList2 = list.stream()
.filter("a"::equals)
.collect(Collectors.toList());
System.out.println(filteredList2);
}
}
在该程序中,我们定义了一个list
变量,并将其初始化为一个包含几个字符串元素的列表。接着使用Lambda表达式和方法引用实现了对该列表的排序和过滤。在排序中,我们使用了Lambda表达式和方法引用两种方式;在过滤中,同样使用了Lambda表达式和方法引用两种方式。
总结
Java8中的Lambda表达式为Java开发者提供了一种更加简便的函数式编程方式。通过对Lambda表达式的深入学习,我们可以更加高效地编写Java代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java8新特性-Lambda表达式详解 - Python技术站