`

JDK8之lambda表达式

 
阅读更多

       官方介绍: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,常用的方法有averagesumminmax, 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"));

 

分享到:
评论

相关推荐

    jdk1.8 Lambda表达式

    Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...

    Jdk 8 lambda 表达式使用示范

    例如,我们可以定义一个接受两个整数并返回它们之和的Lambda表达式: ```java (int a, int b) -&gt; a + b ``` Lambda表达式可以作为参数传递给支持函数式接口的方法。Java 8为许多常见的单方法接口提供了预定义的...

    Java系列JDK 1.8 新特性之 Lambda表达式.pdf

    ### Java系列JDK 1.8 新特性之 Lambda表达式 #### 1、Lambda表达式介绍 Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名...

    JDK8特性(Lambda表达式+StreamAPI简单示例代码)

    JDK8特性(Lambda表达式+StreamAPI的简单使用示例代码)

    06.第六节-如何精简lambda表达式.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    【Java8】Lambda表达式 和 Stream API 详解笔记.zip

    【Java8】Lambda表达式 和 Stream API 是Java编程语言中的两个重要创新,它们极大地提升了代码的简洁性和可读性,特别是在处理集合数据时。这里我们将深入探讨这两个特性,并结合实际示例来理解它们的工作原理。 ...

    jdk8 新特性stream 和lambda表达式Demo

    在`jdk8Demo`的示例中,你会看到如何将Stream API和Lambda表达式结合,优雅地处理集合数据,实现数据过滤、转换和聚合等功能。这两个特性不仅让Java代码更简洁,而且提高了代码的可读性和可维护性,是Java开发者必须...

    JDK8-Lambda-Course:关于JDK8中Lambda表达式的Oracle Online课程

    Lambda表达式是Oracle JDK 8中的一项核心功能,它允许我们以更简洁、更易读的方式编写匿名函数,无需创建额外的类或接口实现。以下是对Lambda表达式的详细讲解: ### 1. Lambda表达式的基本语法 Lambda表达式的...

    深入浅析JDK8新特性之Lambda表达式

    在Java 8中,Lambda表达式是一个重大更新,它极大地简化了处理功能性接口(只有一个抽象方法的接口)的方式。Lambda表达式本质上是匿名函数,允许将函数作为一个值传递,这正是行为参数化的体现。在传统的Java编程中...

    08.第八节-使用lambda表达式创建线程.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    10.第十节-使用lambda表达式实现排序.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    09.第九节-使用lambda表达式遍历集合.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    Java 1.8 lambda表达式示例源码

    Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,可以作为参数传递,也可以作为方法返回。 首先,我们需要理解什么是函数式接口。函数式接口是指只有一个抽象方法的接口,这样...

    05.第五节-lambda表达式语法的介绍.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    04.第四节-什么是lambda表达式概念.mp4

    Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...

    lambda 表达式导致 Arthas 无法 redefine 的问题

    不同的JDK版本可能会对Lambda表达式对应的字节码实现进行不同的优化,这导致了方法名的变化,从而使得Arthas无法识别并正确地重新定义类。在上述描述中,线上环境使用的JDK版本为1.8.0_66-b17,而本地开发环境的JDK...

    Lambda表达式.xmind

    JavaSE,jdk8新特性,Lambda表达式思维导图

    GreenHatHG#blog_md#JDK8新特性之Lambda表达式的基本语法1

    简介官方文档:Lambda Expressions (The Java Tutorials &gt; Learning the Java Language &gt; Cla

    Java JDK 1.8 lambda的用法详解

    Java JDK 1.8 中的 Lambda 表达式是一种功能强大且灵活的编程技术,可以帮助开发者编写简洁、可读性强的代码。其中,Lambda 表达式的遍历数组方法是其中一个重要的应用场景。在本文中,我们将详细介绍 Java JDK 1.8 ...

Global site tag (gtag.js) - Google Analytics