1. 介绍
Lambda表达式是Java8的新特性,一个最为重要用法是简化某些匿名内部类的写法。在加上结合新增的的流相关的 API使用,让我这个java小白觉得相当牛x,至于多牛x,上代码体验。一起学习吧..
2. Lambda表达式使用
2.1 无参函数的简写
需求: 新建一个线程
new Thread(new Runnable(){ @Override public void run(){ System.out.println("Thread1 run()"); } } ).start();
|
new Thread( () -> System.out.println("Thread1 run()") ).start();
new Thread( () -> { System.out.println("Hello Thread1 "); System.out.println("Thread1 run()") } ).start();
|
对比:
- 省略接口名函数名
- 不用再定义接口Runnable的匿名对象
2.2 有参函数的简写
需求: 给一个字符串列表通过自定义比较器,按照字符串长度进行排序
List<String> list = Arrays.asList("PHP", "JAVA", "GO", "PYTHON");
Collections.sort(list, new Comparator<String>(){ @Override public int compare(String s1, String s2){ if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); } });
|
List<String> list = Arrays.asList("PHP", "JAVA", "GO", "PYTHON");
Collections.sort(list, (s1, s2) ->{ if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); });
|
2.3 更多合法的书写形式
Runnable run = () -> System.out.println("Hello World"); ActionListener listener = event -> System.out.println("button clicked"); Runnable multiLine = () -> { System.out.print("Hello"); System.out.println(" Hoolee"); }; BinaryOperator<Long> add = (Long x, Long y) -> x + y; BinaryOperator<Long> addImplicit = (x, y) -> x + y;
|
- 1处展示了无参函数的简写
- 2处展示了有参函数的简写,以及类型推断机制
- 3处是代码块的写法
- 4处和5处再次展示了类型推断机制
3.简写依据
3.1 依据一:函数接口
能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。这意味着你并不能在代码的任何地方任性的写Lambda表达式
3.2 依据二:类型推断机制
Lambda表达式另一个依据是类型推断机制,在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名