lambda表达式
一:定义
可以理解为匿名函数:没有名称,但有参数列表,函数主体,返回类型甚至可抛出的异常列表。
语法:(argument) -> (body)
实例:
lambda表达式通常用于函数式接口中。
函数式接口
语言设计者投入了大量精力来思考如何使现有的函数友好地支持lambda。最终采取的方法是:增加函数式接口的概念。函数式接口就是一个具有一个方法的普通接口。像这样的接口,可以被隐式转换为lambda表达式。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的两个例子。在实际使用过程中,函数式接口是容易出错的:如有某个人在接口定义中增加了另一个方法,这时,这个接口就不再是函数式的了,并且编译过程也会失败。为了克服函数式接口的这种脆弱性并且能够明确声明接口作为函数式接口的意图,Java 8增加了一种特殊的注解@FunctionalInterface(Java 8中所有类库的已有接口都添加了@FunctionalInterface注解)。只包含一个抽象方法的接口,注意是只有一个抽象方法,不是只有一个方法。也就是说Functional接口
除了一个抽象方法外,还可以有默认方法和静态方法。
java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run()。
eg1:
new Thread(
() -> System.out.println("Hello from thread")
).start();
}
eg2:
/**
* 函数式接口1
*
* @author wangmaoyu
* @create 2018-03-01 22:58
**/
@FunctionalInterface
public interface IWaterAnimal {
void run(String s);
default void breathe(){
System.out.println("可以在水中呼吸");
}
}
/**
* 函数式接口2
*
* @author wangmaoyu
* @create 2018-03-01 23:59
**/
@FunctionalInterface
public interface ILandAnimal{
void run(String s);
default void breathe(){
System.out.println("我可以在空气中呼吸");
}
}
/**
* 函数式接口测试类
*
* @author wangmaoyu
* @create 2018-03-01 23:54
**/
public class Frog implements IWaterAnimal,ILandAnimal {
@Override
public void run(String s) {
System.out.println(s);
}
@Override
public void breathe() {
//解决接口方法冲突
ILandAnimal.super.breathe();
//可以选择重写
System.out.println("我在哪都能呼吸");
}
public static void main(String[] args) {
Frog frog = new Frog();
frog.run("我是青蛙,我会跳");
frog.breathe();
}
}
方法引用
方法引用分类:
1.类名::静态方法名
2.引用名::实例方法名
3.类名::实例方法名
4.构造方法引用:类名::new
eg:
/**
* 方法引用实体类
*
* @author wangmaoyu
* @create 2018-02-28 0:26
**/
public class Person {
public enum Sex{
MALE,FEMALE
}
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
int score;
public String getEmailAddress() {
return emailAddress;
}
public Sex getGender() {
return gender;
}
public int getScore() {
return score;
}
public LocalDate getBirthday() {
return birthday;
}
public String getName() {
return name;
}
public static int compareByAge(Person a,Person b){
return a.birthday.compareTo(b.birthday);
}
public int comparePersonByScore(Person Person1, Person Person2) {
return Person1.getScore() - Person2.getScore();
}
public static void main(String[] args) {
Person p1=new Person();
p1.name="wmy";
p1.gender=Sex.MALE;
p1.score=24;
p1.birthday=LocalDate.ofYearDay(1999,81);
Person p2=new Person();
p2.name="zjl";
p2.gender=Sex.FEMALE;
p2.score=74;
p2.birthday=LocalDate.ofYearDay(1998,81);
Person[] persons=new Person[2];
persons[0]=p1;
persons[1]=p2;
//使用匿名类
Arrays.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.birthday.compareTo(o2.birthday);
}
});
/* //使用lambda表达式
Arrays.sort(persons, (o1, o2) -> o1.birthday.compareTo(o2.birthday));
//使用lambda表达式和类的静态方法
Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));
//使用方法引用
Arrays.sort(persons,Person::compareByAge);
//使用比较器的静态方法
Arrays.sort(persons, Comparator.comparing(o -> o.birthday));
Arrays.asList(persons).sort(Person::compareByAge);*/
Person p3=new Person();
//类名::实例方法名
Arrays.asList(persons).sort(p3::comparePersonByScore);
// System.out.println(persons[0].getBirthday());
System.out.println(persons[0].getScore());
}