官方介绍:Lambda expressions are a new and important feature included in Java SE 8. They provide a clear and concise way to represent one method interface using an expression. Lambda expressions also improve the Collection
libraries making it easier to iterate through, filter, and extract data from a Collection
. In addition, new concurrency features improve performance in multicore environments。
函数编程在C#、Python、JavaScript中都得到充分体现。而Java直到最新的Java 8才开始正式支持函数编程,最明显的改进就是对Lambda表达式的支持。正如C#之父Anders Hejlsberg在那篇文章《编程语言大趋势》中所讲,未来的编程语言将逐渐融合各自的特性,而不存在单纯的声明式语言(如之前的Java)或者单纯的函数编程语言。将来声明式编程语言借鉴函数编程思想,函数编程语言融合声明式编程特性...这几乎是一种必然趋势。
HotSpot 实现
Lambda 不只是可以减少很多代码的编写,其字节码和运行时的实现也比 Java 7 中的匿名类的效率更高。针对每一个 Lambda 表达式,编译器都会创建一个对应的形如 Lambda$1() 这样的方法。这个过程被称之为 Lambda body desugaring. 当遇见一个 Lambda 表达式,编译器将会发起一个 invokedynamic 调用,并从目标功能接口中获取返回值。
一、java为什么需要Lambda表达式
1、更方便地遍历、过滤、操作集合中的数据,可以并行处理,充分利用多核CPU的优势,有利于JIT编译器对代码进行优化:
例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach((Integer value) -> System.out.println(value));
2、传递行为,而不仅仅是传值:
例如:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
List<String> filteredNames = names.stream().filter(e -> e.length() >= 4).collect(Collectors.toList());
filteredNames.forEach((String value) -> System.out.println(value));
Stream.reduce,常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值。Stream.collection与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值。其实上述stream的很多操作都是基于java.util.function包中的接口来实现的。例如Predicate用来实filter,Supplier用来实现collect。
二、Lambda表达式中的stream的生成
stream的生成主要有2种方式:
1、通过collection接口的stream方法生成
例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> stream = numbers.stream();
2、通过Stream类的静态方法创建
例如:生成斐波那契数列
class FibonacciSupplier implements Supplier<Long> {
long a = 0;
long b = 1;
@Override
public Long get() {
long x = a + b;
a = b;
b = x;
return a;
}
}
public class FibonacciStream {
public static void main(String[] args) {
Stream<Long> fibonacci = Stream.generate(new FibonacciSupplier());
fibonacci.limit(10).forEach(System.out::println);
}
}
三、使用Lambda表达式编写函数式接口
函数式接口是指只包含一个方法的接口,比如runnable、comparable、Listener等。比如注册监听器、比较2个集合内的元素,我们通常会写一个内部类并实现一个方法来达到目的,而Lambda却可以简化其中的大部分代码而达到同样的目的。例如:
Runnable Lambda
public class RunnableTest { 1 public static void main(String[] args) { 2 3 System.out.println("===RunnableTest==="); 4 5 //AnonymousRunnable 6 Runnable r1 = new Runnable(){ 7 8 @Override 9 public void run(){ 10 System.out.println("Helloworldone!"); 11 } 12 }; 13 14 //LambdaRunnable 15 Runnable r2 = () -> System.out.println("Helloworldtwo!"); 16 17 //Runem! 18 r1.run(); 19 r2.run(); 20 21 } 22 }
Comparator Lambda
14 public class ComparatorTest { 15 16 public static void main(String[] args) { 17 18 List<Person> personList = Person.createShortList(); 19 20 //SortwithInnerClass 21 Collections.sort(personList, new Comparator<Person>(){ 22 public int compare(Person p1, Person p2){ 23 return p1.getSurName().compareTo(p2.getSurName()); 24 } 25 }); 26 27 System.out.println("===SortedAscSurName==="); 28 for(Person p:personList){ 29 p.printName(); 30 } 31 32 //UseLambdainstead 33 34 //PrintAsc 35 System.out.println("===SortedAscSurName==="); 36 Collections.sort(personList, (Person p1, Person p2) -> p1.getSurName().compareTo(p2.getSurName())); 37 38 for(Person p:personList){ 39 p.printName(); 40 } 41 42 //PrintDesc 43 System.out.println("===SortedDescSurName==="); 44 Collections.sort(personList, (p1, p2) -> p2.getSurName().compareTo(p1.getSurName())); 45 46 for(Person p:personList){ 47 p.printName(); 48 } 49 50 } 51 }
Listener Lambda
JButton testButton = new JButton("TestButton"); 17 testButton.addActionListener(new ActionListener(){ 18 @Override public void actionPerformed(ActionEvent ae){ 19 System.out.println("ClickDetectedbyAnonClass"); 20 } 21 }); 22 23 testButton.addActionListener(e -> System.out.println("ClickDetectedbyLambdaListner"));
相关推荐
Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...
例如,我们可以定义一个接受两个整数并返回它们之和的Lambda表达式: ```java (int a, int b) -> a + b ``` Lambda表达式可以作为参数传递给支持函数式接口的方法。Java 8为许多常见的单方法接口提供了预定义的...
### Java系列JDK 1.8 新特性之 Lambda表达式 #### 1、Lambda表达式介绍 Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名...
JDK8特性(Lambda表达式+StreamAPI的简单使用示例代码)
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
【Java8】Lambda表达式 和 Stream API 是Java编程语言中的两个重要创新,它们极大地提升了代码的简洁性和可读性,特别是在处理集合数据时。这里我们将深入探讨这两个特性,并结合实际示例来理解它们的工作原理。 ...
在`jdk8Demo`的示例中,你会看到如何将Stream API和Lambda表达式结合,优雅地处理集合数据,实现数据过滤、转换和聚合等功能。这两个特性不仅让Java代码更简洁,而且提高了代码的可读性和可维护性,是Java开发者必须...
Lambda表达式是Oracle JDK 8中的一项核心功能,它允许我们以更简洁、更易读的方式编写匿名函数,无需创建额外的类或接口实现。以下是对Lambda表达式的详细讲解: ### 1. Lambda表达式的基本语法 Lambda表达式的...
在Java 8中,Lambda表达式是一个重大更新,它极大地简化了处理功能性接口(只有一个抽象方法的接口)的方式。Lambda表达式本质上是匿名函数,允许将函数作为一个值传递,这正是行为参数化的体现。在传统的Java编程中...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,可以作为参数传递,也可以作为方法返回。 首先,我们需要理解什么是函数式接口。函数式接口是指只有一个抽象方法的接口,这样...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
不同的JDK版本可能会对Lambda表达式对应的字节码实现进行不同的优化,这导致了方法名的变化,从而使得Arthas无法识别并正确地重新定义类。在上述描述中,线上环境使用的JDK版本为1.8.0_66-b17,而本地开发环境的JDK...
JavaSE,jdk8新特性,Lambda表达式思维导图
简介官方文档:Lambda Expressions (The Java Tutorials > Learning the Java Language > Cla
Java JDK 1.8 中的 Lambda 表达式是一种功能强大且灵活的编程技术,可以帮助开发者编写简洁、可读性强的代码。其中,Lambda 表达式的遍历数组方法是其中一个重要的应用场景。在本文中,我们将详细介绍 Java JDK 1.8 ...