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

前言

刚好今天看到了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 languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
        System.out.println("Languages which starts with J :");

        Predicate p = s -> s.startsWith("J");

        languages.forEach((language) -> {
            if (p.test(language)) {
                System.out.println(language + " ");
            }
        });

运行结果如下:
Java中的lamda表达式---更加高效简洁的表达方式_第1张图片

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

运行结果如下:
Java中的lamda表达式---更加高效简洁的表达方式_第2张图片

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

这里将每个数加上自己增值0.12倍以后的结果,用map做转换,结果如下:
Java中的lamda表达式---更加高效简洁的表达方式_第3张图片

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

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

结果如下:
Java中的lamda表达式---更加高效简洁的表达方式_第4张图片

结语

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

你可能感兴趣的:(JAVA学习)