函数式编程思想(强调做什么,不是是么形式做),不同于面向对象的思想(做事找对象,对象调方法,完成事情)。 简化匿名内部类的书写
lambda表达式格式:
(参数列表)->{重写方法的代码}
解释:
1.():指重写方法所要用到的参数列表,多个参数用','隔开
2.->传递,把参数传递给方法体
lambda表达式使用前提
1.使用Lambda表达式必须有接口,且接口中有且仅有一个抽象方法(该接口称为“函数式接口”)
例:JDK内置的Runnable、comparator接口
2.使用lambda表达式必须具有"上下文推断"
eg1.(无参数无返回值)
interface Cook{
public abstract void makeFood();
}
public class demo_Lambda {
public static void invokeCook(Cook c) {
c.makeFood();
}
public static void main(String[] args) {
invokeCook(()->{
System.out.println("吃饭@");
});
}
}
eg2.
package demo;
import java.util.Arrays;
import java.util.Comparator;
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class demo_Lambda {
public static void main(String[] args) {
Person []p= {new Person("佟丽娅",20),
new Person("宋佳", 18),
new Person("关晓彤", 48)};
Arrays.sort(p,(Person arg0, Person arg1)-> {
return arg0.getAge()-arg1.getAge();
});
// Arrays.sort(p,new Comparator<Person>() {
//
// @Override
// public int compare(Person arg0, Person arg1) {
// return arg0.getAge()-arg1.getAge();
// }
// });
for(Person per: p)
System.out.println(per.toString());
}
}
lambda表达式省略规则:
1.小括号内的参数类型可以省略
2.如果小括号内的参数有且仅有一个,则小括号可以省略
3.若大括号里有且仅有一个语句,则无论有无返回值均可省略大括号、return关键字和分号。
注意:大括号、return关键字和分号三者必须同时省去或者不省去
eg.
Arrays.sort(p,(Person arg0, Person arg1)-> {
return arg0.getAge()-arg1.getAge();
});
->
Arrays.sort(p,(Person arg0, Person arg1)->arg0.getAge()-arg1.getAge());