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

前言

恰好今天看到了lambda表达式,学习了一下基本用法,因为上午就是翻开几篇博客看了看,怕本身忘了,因此仍是经过博客的方式记录下。语法确实简洁高效,之后也会在代码里慢慢转变多使用lambda表达式。

前提

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

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

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

用法

  • 对匿名内部类的简写android

    对于经常使用的匿名内部类,咱们知道很简单,可是在代码上老是感受很长,那么经过lambda表达式能够对着一块的内容进行简写,从而使代码着一块看起来更加简洁高效。例如一般建立一个新的线程:web

//普通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()方法里是没有参数的,因此能够直接用()来表示,->后的内容表示方法内的操做。也能够直接用::操做符直接进行该操做。redux

  • 对监听的简单写法:
    咱们在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 + " ");
            }
        });

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

  • 函数式接口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));

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

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

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

结语

由于也就看了大概几个小时,因此总结的也不那么充分,参考了别人的博客不过本身也有所有敲一遍加深印象,这篇就是留做加深印象防止本身忘记的,感受平时遇到一些小知识均可以写写博客记录如下,之后就算忘了再看一遍本身总结过的内容也很容易拿起来~