叁叁肆2018-12-02 14:16此文已由作者赵计刚薪授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
一、处理匿名内部类
1、Runnable接口
1 new Thread(new Runnable() {
2 public void run() {
3 System.out.println("hello world!!!");
4 }
5 }).start();
6
7 // lambda
8 new Thread(()->System.out.println("hello lambda!!!")).start();
说明:
lambda基本语法:(形参列表)->{方法体}
注意:
2、Comparator接口
1 List<String> strList = Arrays.asList("zhaojigang","nana","tianya");
2 //原来的方式
3 Collections.sort(strList, new Comparator<String>() {
4 @Override
5 public int compare(String s1, String s2) {
6 return s1.compareTo(s2);
7 }
8 });
9
10 //lambda
11 Collections.sort(strList, (s1, s2)->s1.compareTo(s2));
说明:这里的s1和s2就被根据comparator的泛型和strList的泛型推断出了类型为String,可以省略参数类型。
二、方法引用
1 //lambda 2 Collections.sort(strList, (s1, s2)->s1.compareTo(s2)); 3 //方法引用 4 Collections.sort(strList, String::compareTo); 5 //lambda 6 strList.forEach(x->System.out.println(x)); 7 //方法引用 8 strList.forEach(System.out::println);
说明:
注意:
三、局部变量
lambda操作的局部变量必须是final型的,即:在lambda表达式所使用到的局部变量(方法体内的变量或形参)只能被读取,不能被改变。
注意:列出这条约束的原因是防止线程不安全,可能会有疑问,局部变量是方法私有的,怎么会有线程安全问题?
解释:假设我在该方法体内,启动了一个线程并使用lambda表达式去操作一个局部变量count(注意该变量并没有在lambda中进行声明,但是lambda却可以用,这就是"闭包"),而在该线程外且在该方法体内,该方法也操作了count,这时可能就会有线程安全问题了。
四、接口的改变
java的接口也可以写实现default级别的实例方法和静态方法了。
1 public interface LambdaInterface {
2 //default方法
3 default void defaultMethod(){
4 System.out.println("xxxx");
5 }
6 //static方法
7 static void staticMethod(){
8 System.out.println("xxxx");
9 }
10 }
1 public class TestInterface implements LambdaInterface{
2 public static void main(String[] args) {
3 LambdaInterface test = new TestInterface();
4 test.defaultMethod();//default方法测试
5
6 LambdaInterface.staticMethod();//static方法测试
7 }
8 }
用途:当改造老的项目时,想在旧的接口中添加一些方法,但是又不想让该接口的旧的实现类去实现这些方法时,可以使用这个技巧。
更多网易技术、产品、运营经验分享请点击。