编程语言
首页 > 编程语言> > Java lambda表达式基本使用

Java lambda表达式基本使用

作者:互联网

1 本质

1.1 案例

有以下List<Integer>对象:

List<Integer> list = Arrays.asList(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);

在对List进行从小大大排序时,会用到List#sort(Comparator)方法,需要传递实现Comparator接口的对象作为参数:

default void sort(Comparator<? super E> c) {
    // 省略方法体
}

可以想到有如下四种不同的代码编写的方式。

1、 创建Comparator的实现类#

根据需求,手动实现Comparator接口:

public class AscComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
}

然后,创建AscComparator实例,传给List#sort(Comparator)方法:

Comparator<Integer> ascComparator = new AscComparator();
list.sort(ascComparator);

2、创建Comparator的匿名对象#

可以直接创建Comparator的匿名对象,然后传给List#sort(Comparator)方法:

Comparator<Integer> anonymousComparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
};
list.sort(anonymousComparator);

等价于:

list.sort(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});

3、lambda表达式

直接使用lambda表达式:

list.sort((o1, o2) -> o1.compareTo(o2));

4、方法引用

使用方法引用(方法引用具体概念和使用可以查看相关文章):

list.sort(Integer::compare);

可以明显看出,使用lambda表达式和方法引用极大提高了开发的速度,提升了代码的简洁性。

1.2 本质

实际上,lambda表达式只是JVM提供的语法糖。在JVM执行过程中,会根据lambda表达式的规则,动态创建出匿名的接口实现类对象。

可以通过查看lambda表达式的Class对象和实例对象来证明这一点:

public class LambdaExpression {
    public void printConsumer(Consumer consumer) {
        System.out.println(consumer.getClass());
        System.out.println(consumer.getClass().getInterfaces()[0]);
        System.out.println(consumer);
    }
}

1、案例1#

运行以下代码:

LambdaExpression lambdaObjPrinter = new LambdaExpression();
lambdaObjPrinter.printConsumer(o -> o.getClass());
lambdaObjPrinter.printConsumer(o -> o.getClass());

会有如下输出:

class lambda.LambdaExpression$$Lambda$1/2003749087
interface java.util.function.Consumer
lambda.LambdaExpression$$Lambda$1/2003749087@41629346
class lambda.LambdaExpression$$Lambda$2/1078694789
interface java.util.function.Consumer
lambda.LambdaExpression$$Lambda$2/1078694789@6d311334

查看编译后的.class文件如下:

LambdaExpression lambdaObjPrinter = new LambdaExpression();
lambdaObjPrinter.printConsumer((o) -> {
    o.getClass();
});
lambdaObjPrinter.printConsumer((o) -> {
    o.getClass();
});

2、案例2

运行如下代码:

LambdaExpression lambdaObjPrinter = new LambdaExpression();
for (int i = 0; i < 2; i++) {
    lambdaObjPrinter.printConsumer(o -> o.getClass());
}
System.out.println("=============");
for (int i = 0; i < 2; i++) {
    lambdaObjPrinter.printConsumer(o -> o.getClass());
}

标签:Java,lambda,代码,JVM,相关文章
来源: