前言
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表达式的入门教程,有什么疑问或建议可以留言一下。