在Java SE 8中,Lambda表达式是最重要的新增特性之一,它标志着Java正式迈入函数式编程的领域。本文将详细介绍Lambda表达式的概念、语法及其实现方式,并通过具体示例说明其在实际开发中的应用。
在上一篇关于Java SE 8的文章中,我们概述了Java SE 8的主要特性和JDK 8在Windows和Mac OS X平台上的安装步骤。本文将继续深入探讨Lambda表达式,并通过一个简单的控制台应用程序演示如何使用Lambda表达式。
源代码托管在我的GitHub账户上,您可以从这里克隆。
Lambda表达式简介
在计算机科学中,Lambda表达式是一种匿名函数,即没有名称的函数。在Java中,所有的函数都是类的成员,称为方法。要在Java中创建方法,通常需要先定义一个类。然而,Java SE 8中的Lambda表达式提供了一种更简洁的方式来定义一个实现单个抽象方法的接口。
Lambda表达式的优点
Lambda表达式简化了代码,提高了可读性和可维护性。通过Lambda表达式,开发者可以避免大量的类声明,从而使代码更加简洁。
下面通过几个示例来说明Lambda表达式的使用:
- 实现接口:在Java SE 8之前,如果要创建一个线程,需要定义一个实现Runnable接口的类。例如:
在Java SE 8中,可以使用Lambda表达式简化这段代码:public class MyRunnable implements Runnable { @Override public void run() { System.out.println("I am running"); } public static void main(String[] args) { MyRunnable r1 = new MyRunnable(); new Thread(r1).start(); }}
public static void main(String[] args) { Runnable r1 = () -> System.out.println("I am running"); new Thread(r1).start();}
- 实现内部类:也可以将类声明为内部类:
public static void main(String[] args) { Runnable r1 = new Runnable() { @Override public void run() { System.out.println("I am running"); } }; new Thread(r1).start();}
- 实现匿名类:进一步简化,可以使用匿名类:
public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("I am running"); } }).start();}
- 使用Lambda表达式:最终,使用Lambda表达式:
或者更简洁地:public static void main(String[] args) { Runnable r1 = () -> System.out.println("I am running"); new Thread(r1).start();}
public static void main(String[] args) { new Thread(() -> System.out.println("I am running")).start();}
功能接口
功能接口是指只有一个抽象方法的接口。Java中有许多这样的接口,例如Runnable、Comparable、Callable等。在Java 8中,这些接口被称为功能接口。
Lambda表达式语法
Lambda表达式由两部分组成,中间用箭头(->)分隔。箭头前面是方法的参数列表,后面是方法体。例如:
Runnable r = () -> { System.out.println("Hello!"); System.out.println("Lambda!");};
Lambda表达式的应用场景
Lambda表达式减少了代码量,降低了自定义类的数量。对于只需要一次使用的接口实现,使用Lambda表达式可以显著简化代码。
定义和实例化功能接口
为了更好地理解Lambda表达式,我们创建一个功能接口,并使用Lambda表达式实现它。假设我们在lambda.interfaces包中创建一个名为HelloInterface的接口,其中包含一个名为doGreeting的抽象方法:
@FunctionalInterfacepublic interface HelloInterface { void doGreeting();}
然后,在lambda.impl包中创建一个类UseHelloInterface,实现并测试这个接口:
public class UseHelloInterface { public static void main(String[] args) { HelloInterface hello = () -> System.out.println("Hello from Lambda expression"); hello.doGreeting(); }}
运行上述代码,输出应为:
Hello from Lambda expression
接下来,我们创建一个带参数的功能接口CalculatorInterface,并在UseCalculatorInterface类中实现它:
@FunctionalInterfacepublic interface CalculatorInterface { void doCalculate(int value1, int value2);}
public class UseCalculatorInterface { public static void main(String[] args) { CalculatorInterface calc = (v1, v2) -> { int result = v1 * v2; System.out.println("The calculation result is: " + result); }; calc.doCalculate(10, 5); }}
运行上述代码,输出应为:
The calculation result is: 50
最后,我们使用内置的功能接口Runnable和Comparator,并通过Lambda表达式实现它们:
public class UseThreading { public static void main(String[] args) { Runnable thrd1 = () -> System.out.println("Hello Thread 1."); new Thread(thrd1).start(); new Thread(() -> System.out.println("Hello Thread 2.")).start(); }}
public class UseComparator { public static void main(String[] args) { List values = new ArrayList<>(); values.add("AAA"); values.add("bbb"); values.add("CCC"); values.add("ddd"); values.add("EEE"); Collections.sort(values, (o1, o2) -> o1.compareToIgnoreCase(o2)); System.out.println(values); }}
通过这些示例,我们可以看到Lambda表达式不仅简化了代码,还提高了代码的可读性和可维护性。