Java 8 新特性之lambda表达式
最近有大概学习了一下C#语言,才知道原来人家在3.0版本(2007年11月)就开始支持了。。而且说真的C#以前一直被认为是Java的模仿者(估计现在还有一些人这样认为),早已经后来居上了。什么LINQ、可空类型等等都已经是很早就支持了,可惜了被.NET平台坑了,不过现在出了.NET Core不知道未来怎么说,BTW,最近Oracle更新Java也是挺勤快的,Java真是命好。扯远了,不管怎么说,今天的主题是介绍Java中的lambda表达式用法。
简介
lambda表达式体现的是一种函数式编程的思想,函数式编程中函数或者说方法是一级公民,主要侧重的是对方法的抽象。我们重点关注的是方法实现的逻辑而不是对象成员。很多人觉得这种东西无非是语法糖,还会影响代码的可读性,如果按照这种说法,其实所有的语言都是语法糖,最终都会转换为机器语言。有些语法是挺繁琐而且反人类的,但是lambda表达式绝对不在其中,相反它反而让我们侧重关注实现逻辑而非陷入一大堆啰嗦的接口和参数中。
言归正传,让我们来看下lambda表达式的常见用法吧~其实还是挺简单的。
常见用法
1、替换内部匿名接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("use Inner anonymous Interface.");
}
}).start();
new Thread(() -> System.out.println("use lambda expression.")).start();
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(getApplicationContext(),"use Inner anonymous Interface.",Toast.LENGTH_SHORT);
}
});
btn.setOnClickListener(v -> Toast.makeText(getApplicationContext(),"use lambda expression.",Toast.LENGTH_SHORT));
2、替换for循环
List<String> programLanguages = Arrays.asList("C","C++","Java","Python","Go");
programLanguages.forEach(n -> System.out.println(n));
3、结合方法引用
使用方法引用能进一步的简化代码。
programLanguages.forEach(System.out::println);
4、结合Stream
我们先定义一个Person类
class Person{
public enum Sex{
MAIL,FEMAIL
}
String name;
int age;
Sex gender;
LocalDate birthday;
String emailAddress;
public int getAge(){
return age;
}
public Sex getGender(){
return gender;
}
public LocalDate getBirthday(){
return birthday;
}
public String getEmail(){
return emailAddress;
}
public void printPerson(){
System.out.println("Person Name:" + name + " Age:" + age + " gender:" + gender);
}
public Person(String name,int age,Sex gender,LocalDate birthday,String emailAddress){
this.name = name;
this.age = age;
this.gender = gender;
this.birthday = birthday;
this.emailAddress = emailAddress;
}
}
再定义一个printPersons()方法,使用断言Predicate来判断条件。
//使用filter过滤列表,使用Predicate判断条件
public static void printPersons(List<Person> roster,Predicate<Person> tester){
roster.stream().filter(p -> tester.test(p)).map(p -> p.getEmail()).forEach(System.out::println);//输出过滤后的人的email
}
然后就可以愉快地使用lambda表达式了~~
List<Person> persons = new ArrayList<>();
persons.add(new Person("Jack",20,Person.Sex.MAIL,LocalDate.of(1998,1,2),"jack@gmail.com"));
persons.add(new Person("Mary",22,Person.Sex.FEMAIL,LocalDate.of(1996,2,2),"mary@123.com"));
persons.add(new Person("Mike",16,Person.Sex.MAIL,LocalDate.of(2002,6,6),"mike@hotmail.com"));
persons.add(new Person("John",26,Person.Sex.MAIL,LocalDate.of(1992,12,2),"john@iclound.com"));
printPersons(persons,(Person p) -> p.getGender() == Person.Sex.MAIL
&& p.getAge() >= 18 && p.getAge() <= 25);
That's All.