Lambda表达式的基本写法: (参数)->表达式或{语句} ,即它是一个匿名函数,在参数和函数体之间用“->”来表示。
常见的写法:
(int x) -> {return x+1} //单个参数
(int x) -> x+1 //返回值直接用表达式
(x) -> x+1 //省略参数的类型
x -> x+1 //如果只有一个参数,则参数的圆括号可省略
(x,y) -> x+y //两个参数
(Person) -> {System.out.pirntln(person.age)} //返回void
(n) -> { double f=1; for(int i=0;i<n;i++)s*=i; return f; } //复杂语句
() -> {System.gc();} // 0个参数
函数式接口:在能使用Lambda表达式的地方,可以直接使用函数表达式。其常见写法: 类名::方法名 。
下面的例子是对与同样的Arrays.sort方法(比较数组特定元素),接口、匿名类、Lambda表达式、函数表达式这几种写法都可以,
其中Lambda表达式最为简洁。
import java.util.Arrays;
import java.util.Comparator;
class Person{
public String name;
public int age;
public double score;
public Person(String n,int a,double s) {
name=n; age=a; score=s;
}
public String getName() {return name;}
public String toString() {
return String.format("%s[%d](%f)", name,age,score);
}
public static int better(Person p1,Person p2) {
return (int)(p2.score-p1.score);
}
}
class LambdaArraySort {
public static void main(String[] args) {
Person[] people = new Person[] {
new Person("Ted", 18, 9),
new Person("charlotte", 19, 88),
new Person("Michael", 20, 99),
new Person("matthew", 21, 84)
};
//使用匿名类来实现接口Comparator,比较age
Arrays.sort(people,new Comparator() {
public int compare(Object p1,Object p2) {
return ((Person)p1).age-((Person)p2).age;
}
});
//使用Lambda表达式赋值给接口,比较age
Comparator<Person> compareAge=
(p1,p2)->p1.age-p2.age;
Arrays.sort(people,compareAge);
//直接使用Lambda表达式做函数的参数,比较age、score、name
Arrays.sort(people,
(p1,p2)->p1.age-p2.age);
Arrays.sort(people,
(p1,p2)->(int)(p1.score-p2.score));
Arrays.sort(people,
(p1,p2)->p1.name.compareTo(p2.name));
Arrays.sort(people,
(p1,p2)->p1.name.compareToIgnoreCase(p2.name));
//使用函数表达式,比较score
Comparator<Person> cf= Person::better;
Arrays.sort(people,cf);
Arrays.sort(people,Person::better);
for(Person p:people)
System.out.println(p);
}
}