听过却没玩过Lambda表达式?了解一下

前言

Spring Boot 2.0有很多新的特性,但是这些特性是依赖JDK的版本是jdk 8+才能进行使用的。而JDK1.8给人印象最深刻的变动就是Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。

另外,关于Lambda的读音正确的是:lan b(m) da(兰亩达)[‘læ;mdə],不过可能我们习惯性读成 lam bu da(兰不大)。

并且,虽然看着很先进,其实Lambda表达式的本质只是一个”语法糖”,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

什么是Lambda表达式?

有的人说:

Lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。

有的人说:

Lambda 表达式,也可称为闭包,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

也有的人说:

Lambda表达式,它可以很简洁地表示一个行为或传递代码,现在你可以把Lambda表达式看作匿名功能,它基本上就是没有声明名称的方法,但和匿名类一样,它也可以作为参数传递给一个方法。

简单的理解就是:Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算(λ->α、β)得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数,允许把函数作为一个方法的参数传递到方法中(函数作为参数传递进方法)。

Lambda入门

没有使用Lambda的老方法:

button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent actionEvent){
        System.out.println("Action detected");
    }
});

使用Lambda:

button.addActionListener(() -> { 
    System.out.println("Action detected");
});

不采用Lambda的老方法:

Runnable runnable1=new Runnable(){
@Override
public void run(){
    System.out.println("Running without Lambda");
}
};

使用Lambda优化内部调用:

Runnable runnable2=()->{
    System.out.println("Running from Lambda");
};

Lambda运行DEMO

下面是一个比较完整的范例,可以直接copy到eclipse或idea运行

package lambda;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Demo1 {
    public static void main(String[] args) {
        String[] languagesStr= {"Vue.js", "Spring Boot",  
                "Zuul", "Eureka","Spring Cloud",  
                "Lombok","Lambda"};  
        List<String> languages=  Arrays.asList(languagesStr);  

        // 以前的循环方式  
        System.out.println(">>>以前的循环方式:");
        for (String language: languages) {  
            System.out.println(language+ ";");  
        }  

        System.out.println(">>>使用 lambda 表达式以及函数操作");
        // 使用 lambda 表达式以及函数操作(functional operation)  
        languages.forEach((language) -> System.out.println(language+ "; "));  

        // 在 Java 8 中使用双冒号操作符(double colon operator)  
        System.out.println(">>>双冒号操作符System.out::println");
        languages.forEach(System.out::println);  

        //匿名内部类根据 name 排序  
        Arrays.sort(languagesStr, new Comparator<String>() {  
            @Override  
            public int compare(String s1, String s2) {  
                return (s1.compareTo(s2));  
            }  
        });  
        //按照字母大小排列
        Arrays.sort(languagesStr, (String s1, String s2) -> (s1.compareTo(s2))); 
        List<String> sortLanguages=  Arrays.asList(languagesStr);  
        System.out.println(">>>languagesStr(Comparator)->"+sortLanguages);
        // 也可以采用如下形式:  
    }
}

这里写图片描述
所以你平时见到简单的一句话,其实是分解拆分成以上一个过程用Lambda来简化。

Lambdas和Streams进阶

Stream是JDK8提供给我们的对于元素集合统一、快速、并行操作的一种方式。

package lambda;

public class Person {
    private String name,job;  
    private int salary, age;
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getJob() {return job;}
    public void setJob(String job) {this.job = job;}
    public int getSalary() {return salary;}
    public void setSalary(int salary) {this.salary = salary;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    public Person(String name, String job, int age,int salary) {
        super();
        this.name = name;
        this.job = job;
        this.salary = salary;
        this.age = age;
    }  

}
package lambda;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

public class Lambda {
    public static void main(String[] args) {

        List<Person> javaProgrammers = new ArrayList<Person>() {  
            private static final long serialVersionUID = 1L;
            {  
                add(new Person("亚瑟", "Java", 43, 20000));  
                add(new Person("兰陵王", "Java", 23, 15000));  
                add(new Person("孙尚香", "Java", 33, 18000));  
                add(new Person("刘备", "Java", 32, 16000));  
                add(new Person("百里守约", "Java", 22, 12000));  
                add(new Person("百里玄策", "Java", 27, 19000));  
            }  
        };  

        System.out.println("");  
        System.out.println(">>>所有JAVA程序员的姓名和年龄:");  
        javaProgrammers.forEach((p) -> System.out.printf("%s  %d; ", p.getName(), p.getAge()));  

        System.out.println("");  
        System.out.println(">>>下面是5个  月薪超过 $1,4000  的JAVA程序员:"); 
        List<Person> sortedJavaProgrammers = javaProgrammers.stream()  
                .limit(5)
                .filter((p) -> (p.getSalary() > 14000))  
                .collect(Collectors.toList());

        sortedJavaProgrammers.forEach((p) -> System.out.printf("姓名: %s , 月薪: %s ;", p.getName(), p.getSalary()));  

        System.out.println("");  
        System.out.println(">>>将name拼接成字符串:");  
        String javeDevStr = javaProgrammers  
                .stream()  
                .map(Person::getName)  
                .collect(Collectors.joining(" ; ")); // 在进一步的操作中可以作为标记(token)     
        System.out.println("javeDevStr->"+javeDevStr);

        System.out.println(">>>将name 存放到 Set:");  
        Set<String> javeDevSet = javaProgrammers  
                .stream()  
                .map(Person::getName)  
                .collect(Collectors.toSet());  

        System.out.println(">>>将 name 存放到 TreeSet:");  
        TreeSet<String> javeTreeSet = javaProgrammers  
                .stream()  
                .map(Person::getName)  
                .collect(Collectors.toCollection(TreeSet::new));  
    }
}

这里写图片描述

好了,以上就是Lambda表达式的入门教程,有什么疑问或建议可以留言一下。

猜你喜欢

转载自blog.csdn.net/moshowgame/article/details/81277050
今日推荐