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)); }