一、Lambada表达式概述
Lambada表达式是Java 8引入的一个新特性,可以简化代码并使代码更加易读。使用Lambada表达式可以将一个方法作为参数传递给方法,或者将代码块作为参数传递给方法。在Lambada表达式内可以使用箭头运算符“->”,左侧为方法参数,右侧为方法体。
Comparator comparator = (a, b) -> a - b;
上述代码创建了一个Comparator对象,使用Lambada表达式实现了compare方法。在比较两个整数时,返回它们的差值。
二、Lambada表达式实现接口
Lambada表达式一般用于实现只有一个方法的接口,这种接口也被称为函数式接口。实现函数式接口的常用方法是使用匿名内部类,但Lambada表达式更加简洁明了。
@FunctionalInterface public interface Calculator { int add(int a, int b); } public class CalculatorTest { public static void main(String[] args) { Calculator calculator = (a, b) -> a + b; System.out.println(calculator.add(1, 2)); // 输出结果为3 } }
上述代码中,Calculator是一个函数式接口,使用Lambada表达式实现了add方法。在CalculatorTest类中创建了Calculator对象,使用Lambada表达式的方式实现了add方法。可以看到,使用Lambada表达式的方式比使用匿名内部类的方式更加简洁。
三、Lambada表达式的变量作用域
Lambada表达式中的变量作用域与匿名内部类的作用域类似,可以访问当前方法中的final变量,以及实例变量和静态变量。
public class LambdaScopeTest { final int num = 1; // final变量可以被Lambada表达式访问 static int staticNum = 2; // 静态变量可以被Lambada表达式访问 int instanceNum = 3; // 实例变量可以被Lambada表达式访问 public void testScope() { int tempNum = 4; // 局部变量在Lambada表达式中必须是final的 Consumer consumer = (num) -> { System.out.println("final变量:" + this.num); System.out.println("静态变量:" + staticNum); System.out.println("实例变量:" + instanceNum); System.out.println("局部变量:" + tempNum); }; consumer.accept(num); } public static void main(String[] args) { new LambdaScopeTest().testScope(); } }
上述代码创建了一个LambdaScopeTest类,定义了final、静态、实例和局部四种类型的变量,然后在testScope方法中使用Lambada表达式访问这些变量。可以看到,Lambada表达式可以访问final变量、静态变量和实例变量,但在Lambada表达式内定义的局部变量必须是final的。
四、Lambada表达式的方法引用
Lambada表达式中也可以使用方法引用的方式来代替代码块。使用方法引用可以简化代码并增强可读性。
public class MethodReferenceTest { public static void print(String s) { System.out.println(s); } public void testMethodReference() { Consumer consumer1 = (s) -> System.out.println(s); Consumer consumer2 = System.out::println; Consumer consumer3 = MethodReferenceTest::print; consumer1.accept("Lambada表达式"); consumer2.accept("方法引用"); consumer3.accept("静态方法引用"); } public static void main(String[] args) { new MethodReferenceTest().testMethodReference(); } }
上述代码创建了一个MethodReferenceTest类,其中定义了一个静态方法print。在testMethodReference方法中,使用Lambada表达式和方法引用的方式来调用print方法。可以看到,使用方法引用的方式比使用Lambada表达式的方式更加简洁明了。
五、Lambada表达式与Stream API
Lambada表达式常常与Stream API一起使用,可以实现对集合类对象的操作。Stream API可以以管道的方式对集合类对象进行处理,当需要对集合类对象进行筛选、排序、分组等操作时,Lambada表达式和Stream API可以快速地完成这些操作。
public class StreamTest { public static void main(String[] args) { List list = Arrays.asList(1, 3, 2, 4, 5, 6, 7, 8, 9); list.stream() .filter(i -> i % 2 == 0) // 筛选偶数 .sorted() // 排序 .map(i -> "数字:" + i) // 转换成字符串 .forEach(System.out::println); // 输出结果 } }
上述代码使用了Stream API和Lambada表达式来对Integer型数组进行处理。首先使用filter方法筛选出偶数,然后使用sorted方法进行排序,之后使用map方法将数字转换为字符串。最后使用forEach方法输出筛选、排序、转换后的结果。
六、Lambada表达式与多线程
Lambada表达式在实现多线程程序时也有很好的支持。在Runnable接口中只有一个run方法,可以使用Lambada表达式的方式实现,可以将多线程的代码量缩减到最小。
public class ThreadTest { public static void main(String[] args) { new Thread(() -> System.out.println("Lambada表达式实现多线程")).start(); } }
上述代码使用了Lambada表达式的方式实现了Runnable接口,输出一条信息。可以看到,通过使用Lambada表达式的方式实现Runnable接口,相比使用匿名内部类的方式,代码量大大减少。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/294187.html