Java8新特性之Lambda表达式

一、Lambda表达式概述

Lambda表达式是Java8推出的新特性,是函数式编程的一种实现。通过配合函数式接口,可以使代码更加的简洁、明了,同时可以有效地减少代码量。Lambda通常用在需要使用匿名内部类的地方。Lambda表达式的主要目的就是突出对象的操作和行为,而简化其它不必要的步骤。它的一般形式如下:

List<String> list = Arrays.asList("A", "B", "C");
list.forEach(e -> System.out.println(e));

二、使用Lambda表达式

Java8中有一个forEach方法用来遍历集合中的元素,在未使用Lambda表达式时我们需要这样使用:

list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});

可以看出forEach方法需要传入一个对象作为参数,这个对象需要实现Consumer接口,在没有使用Lambda表达式时,我们需要将整个的匿名类写出来,代码不够简洁。

1.Lambda表达式的第一种形式

list.forEach((String t) -> {
    System.out.println(t);
});

可以看出,这种方式展现了Lambda的一般化形式,(String t)表示匿名内部类中的方法的参数(在Java8新特性之接口中我们提到过函数式接口中只有一个抽象方法)以及参数类型,->可以看作是Lambda特有的表达式,用来将参数和代码逻辑连接起来。{}中则是代码逻辑。

2.Lambda表达式的简化模式

在1中我们探讨了Lambda表达式的通用模式,但是使用起来还有有点复杂,那么接下来我们继续简化Lambda。

在Java8中添加了类型推断的特性,通过这一特性,我们就无需写出参数的类型,这一工作将交给编译器来完成。

list.forEach((t) -> {
    System.out.println(t);
});

在只有一个参数的情况下,()也可以去掉

list.forEach( t -> {
    System.out.println(t);
});

在代码逻辑较为简单时,我们也可以这样写

list.forEach(t -> System.out.println(t));

3.拥有返回值的Lambda表达式

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

Java的List集合中有一个sort方法,它的参数是Comparator对象,里面的compare方法需要返回一个int类型的值。在拥有返回值的情况下,Lambda表达式如何处理呢?

list.sort((e,t) ->{
    return e.compareTo(t)
});

通常情形下,我们可以这样写。但是当代码逻辑较为简单时,比如上述情形,我们可以进一步简化

//注意这种形式,不能加return关键字,return只能在代码块{}中加
list.sort((e,t) ->e.compareTo(t));

Java编译器会进行自动类型推断,这种情形下,不需要也不能加return

注意:拥有两个以上参数的时候需要写成(e,t,...)这种形式

三、Lambda表达式的实际应用案例

1.创建线程对象

传统方式

new Thread(new Runnable(){
    @Override
    public void run() {
        System.out.println("hello");
    }
}).start();

Lambda表达式

new Thread(() -> System.out.println("hello")).start();

2.数组排序

传统方式

String[] str = {"A","BB","C"};
Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();
    }
});

Lambda表达式

Arrays.sort(str,  (o1,o2) -> o1.length() - o2.length());
原文地址:https://www.cnblogs.com/zwscode/p/14284079.html