Java8 教程

Java8 为什么需要 Lambda 表达式?

下面将通过两个示例,分别使用传统 Java 实现和 Lambda 表达式实现,通过直观的方式说明为什么需要 Lambda 表达式。

示例一

当我们要在另一个独立线程中执行一些逻辑时,通常会将代码放在一个实现 Runnable 接口的类的 run() 方法中。

传统 Java 实现

Java 代码如下:

package com.hxstrive.jdk8.lambda;

/**
* 传统 Java 实现线程
* @author hxstrive.com
*/
public class Demo01 {

   public static void main(String[] args) {
       Demo01 demo = new Demo01();
       new Thread(demo.new Worker()).start();
   }

   class Worker implements Runnable {
       @Override
       public void run() {
           for(int i = 0; i < 10; i++) {
               System.out.println(Thread.currentThread().getName() + " i=" + i);
           }
       }
   }

}

上面代码中,当我们希望执行 Work 的代码时,会构造一个 Worker 类的实例。然后将该实例启动一个新的线程:

Demo01 demo = new Demo01();
new Thread(demo.new Worker()).start();

这段代码的关键在于,run 方法中包含了你希望在另一个线程中执行的代码。

Lambda 表达式实现

Java 代码如下:

package com.hxstrive.jdk8.lambda;

/**
* Lambda 实现线程
* @author hxstrive.com
*/
public class Demo01_2 {

   public static void main(String[] args) {
       Demo01_2 demo = new Demo01_2();
       
       // 看这里
       new Thread(() -> {
           for(int i = 0; i < 10; i++) {
               System.out.println(Thread.currentThread().getName() + " i=" + i);
           }
       }).start();
   }

}

示例二

我们用一个自定义的比较器来进行排序。如果你希望按照字符串的长度而不是默认的字典顺序来排序,那么你可以将一个 Comparator 对象传递给 Arrays.sort() 方法。

传统 Java 实现

代码如下:

package com.hxstrive.jdk8.lambda;

import java.util.Arrays;
import java.util.Comparator;

/**
* 传统 java 方式实现字符数组排序
* @author hxstrive.com
*/
public class Demo02 {

   public static void main(String[] args) {
       Demo02 demo = new Demo02();

       String[] strs = {
               "hello",
               "administrator",
               "java"
       };
       Arrays.sort(strs, demo.new LengthComparator());

       for(String str : strs) {
           System.out.println(str);
       }
   }

   class LengthComparator implements Comparator<String> {
       @Override
       public int compare(String o1, String o2) {
           return o1.length() - o2.length();
       }
   }

}

Lambda 表达式实现

Java 代码如下:

package com.hxstrive.jdk8.lambda;

import java.util.Arrays;
import java.util.Comparator;

/**
* 传统 java 方式实现字符数组排序
* @author hxstrive.com
*/
public class Demo02_2 {

   public static void main(String[] args) {
       Demo02_2 demo = new Demo02_2();

       String[] strs = {
               "hello",
               "administrator",
               "java"
       };
       
       // 看这里
       Arrays.sort(strs, (o1, o2) -> {
           return o1.length() - o2.length();
       });

       for(String str : strs) {
           System.out.println(str);
       }
   }

}

更简单的写法如下:

package com.hxstrive.jdk8.lambda;

import java.util.Arrays;
import java.util.Comparator;

/**
* Lambda 方式实现字符数组排序
* @author hxstrive.com
*/
public class Demo02_3 {

   public static void main(String[] args) {
       Demo02_3 demo = new Demo02_3();

       String[] strs = {
               "hello",
               "administrator",
               "java"
       };
       // 看这里
       Arrays.sort(strs, Comparator.comparingInt(String::length));

       for(String str : strs) {
           System.out.println(str);
       }
   }

}

注意,关于 Lambda 表达式的语法将在后续章节将详细介绍,上面示例仅仅让读者先感受 Lambda 表达式的魅力。

总结

通过上面两个示例,我们可以总结 Lambda 表达式有如下几点优点:

  • 简洁性:Lambda 表达式可以使代码更加简洁,减少冗余的代码,提高可读性。

  • 便利性:Lambda 表达式可以用于创建临时的函数,无需为其定义名称,使得代码更加灵活。

  • 函数式编程:Lambda 表达式是函数式编程的重要组成部分,可以方便地进行函数式编程的操作,如映射、过滤、归约等。

  • 代码可读性:对于简单的函数,使用 Lambda 表达式可以使代码更加清晰和易于理解。

总之,仅仅 Lambda 表达式的简洁性、便利性和代码可读性就值得我们学习和去使用它。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号