Java8新特性(二)-lambda表达式

本次笔记的学习资料源自B站 尚硅谷UP主发布的教学视频,在此感谢尚硅谷无私的公开了很多高质量的教学视频

本次笔记视频地址:

1.什么是lambda表达式 lambda表达式是Java8退出的一种新的语法结构,它可以使代码更简洁紧凑。它的本质就是对接口中抽象方法的具体实现。

2.lambda表达式使用的条件 lambda表达式需要一个"函数式接口"的支持 接口中只有一个抽象方法的接口,称为函数式接口,可以使用注解 @FunctionalInterface 来修饰接口,即限制被修饰的接口里只能存在一个抽象方法。

3.lambda表达式的语法 1> 写一个最简单的lambda表达式, 无参数,无返回值

public static void main(String[] args) {
Runnable r1 = () -> System.out.println("hello lambda");
r1.run();
}

实际上上边代码要表达的意思是这样的

public static void main(String[] args) {
Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello lambda");
            }
        };
        r.run();
}

我们创建了一个类型为Runnable的接口实现类r,实现了Runnable中的抽象方法 run(),方法的功能就是打印"hello lambda"字符串。 lambda把这个创建接口实现类,实现抽象方法过程中最有用的代码提取出来了,剔除了那些繁杂的代码。

() -> System.out.println("hello lambda");

其中()表示实现的抽象方法参数列表,System.out.println("hello lambda")表示方法里要执行的逻辑,-> 可以看作为分隔符分隔两部分内容。java的lambda表达式跟scala中的函数语法很像,可能是借鉴的Scala。

问:既然lambda表达式是创建接口实现类,实现抽象方法的简化,为啥实现的方法不写方法名,像这样,run();而是只写了方法的参数列表呢,像这样()。 答:因为上边说了,lambda表达式实现的接口里只能有一个抽象方法,如果接口里有多个抽象方法不能用lambda表达式的写法,既然只有一个抽象方法,写方法名和不写方法名都是那个方法。能省则省,就不写了。

2> 有一个参数,无返回值

public static void main(String[] args) {
Consumer<String> consumer = (x) -> System.out.println(x);
        consumer.accept("hello lambda");
}

看一下Consumer源码一目了然

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

(x)表示实现了accept方法,System.out.println(x)表示accept方法里的具体逻辑。 问:为什么参数列表里的传参,没有指定类型。 答:jvm编译器可以自己根据上下文推断出来类型,不需要显示的写出来。

3>若只有一个参数,小括号可以省略不写 即例2>中的代码也可以携程下边这样

public static void main(String[] args) {
Consumer<String> consumer = x -> System.out.println(x);
        consumer.accept("hello lambda");
}

4>有两个以上的参数,有返回值,并且lambda 体中有多条语句

public static void main(String[] args) {
Comparator<Integer> com = (x,y) -> {
            System.out.println("hello lambda");
            return x > y ? x:y;
        };
        System.out.println(com.compare(2, 4));
}

5>若lambda体中只有一条语句,return和大括号都可以不写

public static void main(String[] args) {
Comparator<Integer> com = (x,y) -> x > y ? x:y;
        System.out.println(com.compare(2, 4));
}
经验分享 程序员 微信小程序 职场和发展