Java中的lamda表达式---更加高效简洁的表达方式

来源:互联网 发布:全景天窗 知乎 编辑:程序博客网 时间:2024/05/29 07:10

前言

刚好今天看到了lambda表达式,学习了一下基本用法,由于上午就是翻开几篇博客看了看,怕自己忘了,所以还是通过博客的方式记录下。语法确实简洁高效,以后也会在代码里慢慢转变多使用lambda表达式。

前提

想在项目中使用lambda表达式,那么必须在build.gradle文件中加入如下代码:

defaultConfig {       ...//省略        jackOptions {            enabled true        }    }

这样才能够在项目中使用lambda表达式,不过lambda表达式可能会与一些注解框架冲突,具体解决方法自行百度下就知道了。

用法

  • 对匿名内部类的简写

    对于常用的匿名内部类,我们知道很简单,但是在代码上总是感觉很长,那么通过lambda表达式可以对着一块的内容进行简写,从而使代码着一块看起来更加简洁高效。例如通常创建一个新的线程:

//普通java代码        new Thread(new Runnable() {            @Override            public void run() {                System.out.println("开启了一个新的线程~");            }        }).start();        //lambda代码        new Thread(() -> System.out.println("开启了一个新的线程")).start();        //使用::操作符        new Thread(System.out::println).start();

可以看到,创建一个线程,对于同样的操作lambda表达式仅仅用了简单的一行就搞定了,实际上是对于匿名内部对象和方法名的简写。这里的run()方法里是没有参数的,所以可以直接用()来表示,->后的内容表示方法内的操作。也可以直接用::操作符直接进行该操作。

  • 对监听的简单写法:
    我们在android开发中经常要写监听,其实本质也就是对匿名内部类的简写:
tv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                System.out.println("hahaha");            }        });        tv.setOnClickListener((l) -> System.out.println("hahaha"));

可以看到,同样的是对匿名内部类的简写,这里因为View.OnclickListener接口内的onClick(View v)方法里有参数view,所以()中我们加入一个参数“l”,java在解析lambda表达式的时候会自动做参数类型分析,这里的l被分析以后自然是View类型的,所以能用lambda表达式的关键也在与语言对lambda表达式语法的支持。

  • 使用lambda表达式来进行list的迭代:
    我们普通的对list的迭代有几种方法,而对于使用lambda表达式则可以更简单的表达出我们想要迭代的内容:
        //for循环遍历        for (int i = 0; i < arrays.size(); i++) {            System.out.println(i);        }        //foreach遍历        for (String array : arrays) {            System.out.println(array);        }        //lambda 表达式        arrays.forEach(array -> System.out.println(array));        //解引用        arrays.forEach(System.out::println);
  • 使用lambda表达式和函数式接口Predicate:
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");        System.out.println("Languages which starts with J :");        Predicate<String> p = s -> s.startsWith("J");        languages.forEach((language) -> {            if (p.test(language)) {                System.out.println(language + " ");            }        });

运行结果如下:
这里写图片描述

  • 函数式接口Predicate的合并
Predicate<String> j = s -> s.endsWith("a");        Predicate<String> j4 = s -> s.length() == 5;        //通过合并条件选择        languages.stream().filter(j.and(j4)).forEach((name) -> System.out.println(name));

运行结果如下:
这里写图片描述

  • Java 8中使用lambda表达式的Map和Reduce示例
List<Integer> list = Arrays.asList(100, 200, 300, 400);        list.stream().map((cost) -> cost + 0.12 * cost).forEach((cost) -> System.out.println(cost));

这里将每个数加上自己增值0.12倍以后的结果,用map做转换,结果如下:
这里写图片描述

这里通过redux将转换后的结果进行相加求和:

double money = list.stream().map((cost) -> cost + 0.12 * cost).reduce((sum, cost) -> sum += cost).get();        System.out.println("money==" + money);

结果如下:
这里写图片描述

结语

因为也就看了大概几个小时,所以总结的也不那么充分,参考了别人的博客不过自己也有全部敲一遍加深印象,这篇就是留作加深印象防止自己忘记的,感觉平时遇到一些小知识都可以写写博客记录以下,以后就算忘了再看一遍自己总结过的内容也很容易拿起来~