lambda表达式在SE1.8中引入,与接口中的唯一的抽象方法相匹配,语法:(参数列表)->返回值,返回值也可以通过{}和return实现.
1.引入lambda之前,先对一个String列表进行排序
import java.util.*; public class LambdaDemo1 { public static void main(String[] args) { List<String> name = Arrays.asList("James", "Kobe", "Yao"); Collections.sort(name, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareTo(s2); } }); } }
静态方法Collections.sort接收一个list和一个Comparator接口作为输入参数,实现对输入的list中的元素进行比较并排序.通常可以用创建匿名Comparator对象,重写compare方法,并作为参数传递给sort方法.
如果使用lambda表达式,可以使代码更加简短易读:
Collections.sort(name, (String s1, String s2) -> { return s1.compareTo(s2); });
而且,它还可以更简短:
Collections.sort(name, (String s1, String s2) -> s1.compareTo(s2));
此段代码已经省略了{}和return,但是它还可以更短:
Collections.sort(name, (s1, s2) -> s1.compareTo(s2));
编译器能够自动识别参数类型,类型也可以省略不写.
2.函数式接口
一个函数式接口必须有且仅有一个抽象方法声明,可以通过@FunctionalInterface标识,每个与之对应的lambda表达式必须与此相匹配.任何一个只包含一个抽象方法的接口,都可以做成lambda表达式.例:
@FunctionalInterface interface MapDemo<K, V> { V get(K k); } public class LambdaDemo2 { public static void main(String[] args) { MapDemo<String, Integer> map = (k) -> Integer.valueOf(k); System.out.println(map.get("10")); } }
考虑极端一点的话,我们可以将函数式接口中的方法定义为无参无返回值的,lambda同样可以相匹配:
@FunctionalInterface interface MapDemo<K, V> { void get(); } public class LambdaDemo2 { public static void main(String[] args) { MapDemo<String, Integer> map = () -> {}; } }
这里只是举个例子,在实际编程中并不实用.
3.lambda对方法及构造方法的引用
3.1.lambda可以通过关键字来获取方法的引用,可使第2节中的代码更加简短:
public class LambdaDemo3 { public static void main(String[] args) { MapDemo<String, Integer> map = Integer::valueOf; System.out.println(map.get("10")); } }
注意,此段代码中等号右边的Integer是指Integer.valueOf()方法返回值的类型,与上一节代码中的意义不同.
3.2.lambda也可以通过关键字new获取构造方法的引用,例:
class A { String name; public A() { } public A(String name) { this.name = name; } } interface AFactory<T extends A> { T create(String name); } public class LambdaDemo3 { public static void main(String[] args) { AFactory<A> afactory = A::new; A a = afactory.create("name"); System.out.println(a.name); } }
通过A::new创建一个A类构造函数的引用.编译器会自动选择合适的构造函数来匹配A.create方法,并调用正确的构造函数.
4.lambda的可访问范围
4.1.访问局部变量,例:
public class LambdaDemo4 { public static void main(String[] args) { String s = "20"; MapDemo<String, Integer> map = (k) -> Integer.valueOf(k + s); System.out.println(map.get("10")); } }
虽然s不是final的,但此段代码是合法的,运行结果:1020.但下面的代码不合法:
String s = "20"; MapDemo<String, Integer> map = (k) -> Integer.valueOf(k + s); System.out.println(map.get("10")); s="30";
可见,s在编译的时候被隐式的当做final变量来处理,在lambda内部改变s也是不可以的.
4.2.访问成员变量,例:
public class LambdaDemo4 { String s1; static String s2; public void test() { MapDemo<String, Integer> map1 = (k) -> { s1 = "100"; return Integer.valueOf(s1); }; MapDemo<String, Integer> map2 = (k) -> { s2 = "200"; return Integer.valueOf(s2); }; } }
4.3.访问接口的静态方法和默认方法,例:
interface MapDemo<K, V> { V get(K k); static void getStatic() { } default void getDefault() { } } public class LambdaDemo4 { public void test() { MapDemo<String, Integer> map1 = (k) -> { MapDemo.getStatic(); return Integer.valueOf(k); }; MapDemo<String, Integer> map2 = (k) -> { // MapDemo.getDefault(); return Integer.valueOf(k); }; } }
编译发现,静态方法在lambda表达式可以被访问,而默认方法是不可以的.
小结:java SE在1.8引入的lambda表达式实现了与函数式接口中方法的匹配,同时提供很多新的函数式接口,如Comparator等,使程序变得更加简短易读.
相关推荐
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...
3. **方法引用**:当Lambda体完全等同于某个已存在的方法时,可以使用方法引用来替代Lambda表达式,如 `Arrays.sort(list, Comparator.comparingInt(Integer::intValue))`。 4. **构造器引用**:同样,Lambda 表达式...
在Java 8中,编译器可以自动推断lambda表达式中参数的类型,所以大多数情况下我们不需要显式声明类型。 8. **捕获外部变量** Lambda表达式可以访问其所在作用域中的局部变量,但只有当这些变量是final或实际上...
在本文中,我们将深入探讨Lambda表达式的核心概念、语法以及它在实际开发中的应用。 一、Lambda表达式基础 1. **什么是Lambda表达式?** Lambda表达式是一种新的语法结构,它可以被看作是一段没有名字的函数。...
4、函数式接口使用:学习如何使用Lambda表达式与Java中的函数式接口进行交互,包括传递函数、使用函数式接口的默认方法和方法引用。 本源码资源旨在帮助用户掌握以下几个方面: 1、Lambda表达式概述:了解Lambda...
Java 8 中的 Lambda 表达式是语言的重大更新,它引入了函数式编程的概念,使得代码更加简洁、易读。Lambda 表达式的主要目的是简化处理匿名内部类的情况,尤其是当这些类只需要一个方法时。 在传统的 Java 编程中,...
Lambda表达式是Java 8中的一种语法糖,它允许开发者以更简洁的方式定义无状态、无副作用的函数。在描述中提到的代码示例中,对比了使用匿名类和Lambda表达式实现相同功能的方法。 首先,让我们看看匿名类的使用。在...
Java 8 中引入了几个重要的流(Stream)API,与 Lambda 表达式配合使用,可以实现高效且易于理解的集合操作。例如,我们可以使用 `Arrays.stream()` 将数组转换为流,然后通过 `filter()`, `map()`, `reduce()` 等方法...
在Java字节码中,我们可以看到Lambda表达式是如何被转化为一个内部类`InnerClass$1`的,这个内部类实现了`Function`接口并重写了`apply`方法。字节码指令如`new`, `dup`, `invokespecial`和`putfield`等用于创建并...
当Lambda表达式中的代码与已存在的方法或构造器匹配时,可以使用方法引用或构造器引用来代替Lambda。例如,`Arrays.sort(list, Integer::compareTo)`。 4. **三元操作符与Lambda**: Lambda表达式可以替代简单的...
而在Java 8中,同样的功能可以使用Lambda表达式简化为: ```java button.addActionListener(e -> ui.dazzle(e.getModifiers())); ``` 这种方式大大减少了代码的复杂性和冗余,提高了代码的可读性。 Java 8中的...
Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合数据时。Lambda表达式的主要目的是为了创建匿名函数,即没有名字的函数,它可以被当作一个值传递给方法...
此外,Stream API是Java 8的另一大亮点,它与lambda表达式配合使用,提供了丰富的集合操作。例如,过滤和映射操作可以这样实现: ```java list.stream() .filter(s -> s.startsWith("A")) .map(String::...
在Java多核编程中,Lambda表达式常与Stream API结合使用,实现高效的数据并行处理。 1. **Lambda表达式的基本语法** Lambda表达式的语法形式为`(parameters) -> expression`或`(parameters) -> { statements }`。...
总的来说,Lambda表达式是Java语言中的一种强大的工具,它使得代码更加简洁、易于理解和维护。通过减少代码的复杂性,Lambda有助于提升开发效率,尤其是在处理集合操作、并发编程和事件驱动的场景下。理解并熟练运用...
关于Java中lambda的表达式,Java多核编程,清华大学(出版)
- 方法引用:在Lambda表达式中,经常可以直接使用现有的方法来代替Lambda表达式。例如,如果某个类已经有一个方法符合Lambda表达式的要求,可以直接使用类名加方法名的形式来代替。 - Optional类:Optional类的引入...
Lambda表达式与委托结合使用,使得代码更加简洁,尤其在LINQ查询中,Lambda表达式提供了强大的功能。 在`DelegateTest`这个Demo中,你可能会看到如何将这些概念结合起来使用。比如,你可能创建了一个类,该类包含一...