Lambda表达式的标准格式:
由三部分组成:
a. 一些参数
b. 一个箭头
c. 一段代码
格式:
(参数列表)->{一些重写方法的代码的};
解释说明格式:
():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用逗号分隔
->:传递的意思,把参数传递给方法体{}
{} : 重写接口的抽象方法的方法体
感觉这个lambda表达式就是专门为了简化匿名内部类而存在。
例子1:
public interface Caculator {
public abstract int cacl(int a,int b);
}
public class DemoMain {
public static void main(String[] args) {
DemoMain d = new DemoMain();
int q = d.getCalc(10, 20, new Caculator() {
@Override
public int cacl(int a, int b) {
return a + b;
}
});
System.out.println(q);
int p = d.getCalc(120, 140, (int a, int b) -> {
return a + b;
});
System.out.println(p);
}
public int getCalc(int a,int b,Caculator calc){
int sum = calc.cacl(a,b);
return sum;
}
}
例子2:
public class Person{
private String name;
private int age;
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 demotest {
public static void main(String[] args) {
Person[] arr = new Person[]{new Person("小明",18),
new Person("小红 ",19),new Person("小黑",17)};
// Arrays.sort(arr, new Comparator<Person>() {
// @Override
// public int compare(Person o1, Person o2) {
// return o1.getAge() - o2.getAge();//前面减后面实现升序
// }
// });
Arrays.sort(arr,(Person o1, Person o2)->{
return o1.getAge() - o2.getAge();//前面减后面实现升序
});
for (Person person : arr) {
System.out.println(person);
}
}
}
Lambda表达式的省略格式
这里这里有一个参考原则:
可推导即可省略
Lambda表达式强调的是做什么而不是怎么做,所以凡是可以根据上下文推导得知的信息,都可以省略。
省略规则:
在Lambda标准格式的基础上,使用省略写法的规则为:
1、 小括号内参数的类型可以省略;
2、如果小括号内有且仅有一个参数,则小括号可以省略;
3、如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字和语句分号等。
Lambda的使用前提
Lambda的语法非常简洁,完全没有面向对象复杂的束缚,但是使用时有几个问题需要特别注意:
1、使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法唯一存在且唯一时,才可以使用Lambda.
2、使用Lambda必须具有上下文推断。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为改接口的实例。
Arrays.sort(arr,(o1,o2)->o1.getAge()-o2.getAge());
int p = d.getCalc(120, 140, (a,b) ->a + b);