Lambda表达式是JDK1.8 为我们提供的新型语法糖,所以我们在使用朗姆达表达式的时候我们的JDK版本必须是**1.8+**的。
2. 什么时候使用 一般情况下都是相对某个接口的子类或者匿名内部类来进行使用的时候,我们通常会创建一个子类去实现这个接口,但是如果接口里面只有一个抽象方法的时候,并且我们又有很多地方使用到这个接口里面的抽象方法,(千万不要傻到每当碰到不同业务逻辑的时候,我们就去创建一个子类去实现这个接口,然后去重写这个方法。),这时候我们用这个Lambda的语法糖就显得格外的有用,可以简化我们的代码。
但是我们要使用lambda的时候,接口必须只有一个抽象方法
3. 演变过程1. 我们都是知道当我们用一个Class类实现一个接口的时候,必须重写他的方法,(用Lambda的时候,接口有且只有一个抽象方法),这样的话 我们重写方法时,方法名,返回值,返回值,我们都是必须和接口中的那个抽象方法是一样的,我们是不能更改的,所以我们就可以不用些这样已经规定好的,我们可以使用 **()->{}** ,来代替重写方法的参数和方法体。
2. 在方法体中如果只有一行代码的话,我们可以省略大括号,如果有返回值,同时也只有一行代码,连return都可以省调。
3. 方法体只有一行代码,并且只是通过参数去调用这个参数的方法是我们还可以通过**参数类型::方法名**的方式来使用。
4. 分几种情况
(1. 有参数有返回值
package L;
interface Person {
String say(String str);
}
public class TMain {
public static void main(String[] args) {
Person person1 = new Person() {
@Override
public String say(String str) {
return "hello word";
}
};
Person person2 = (str) -> {
return "hello word";
};
Person person3 = (str) ->
"hello word";
}
}
(2. 有参数无返回值
package L;
interface Sheep {
void ship(Integer val);
}
public class TMain2 {
public static void main(String[] args) {
final Integer i = 2;
Sheep sheep1 = new Sheep() {
@Override
public void ship(Integer val) {
val++;
}
};
Sheep sheep2 = (val) -> {
val++;
};
Sheep sheep3 = (val) -> {
val++;
};
Sheep sheep4 = Integer::bytevalue;
}
}
(3. 无参数有返回值
package L;
import java.util.Random;
interface Dog {
Integer wang();
}
public class TMain3 {
public static void main(String[] args) {
Dog dog = new Dog() {
@Override
public Integer wang() {
Random random = new Random();
return random.nextInt();
}
};
Dog dog2 = () -> {
Random random = new Random();
return random.nextInt();
};
Dog dog3 = () -> {
return Math.round(10);
};
Dog dog4 = () ->
Math.round(10);
}
}
-
如果抽象方法的返回值是一个对象的时候,我们方法体正好是一个
return new XXX()的时候;
这时候可以写成 , XXX::new 的方式。



