Java 8新特性之--Lambda表达式详细讲解

简介: Java 8新特性之--Lambda表达式详细讲解

Java 8新特性简介

image.png

  • 速度更快
  • 代码更少(增加了新的语法:Lambda 表达式)
  • 强大的 Stream API l 便于并行
  • 最大化减少空指针异常:Optional
  • Nashorn引擎,允许在JVM上运行JS应用

并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数 据块的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。


Java 8 中将并行流进行了优化,我们可以很容易的对数据进行并行操作。 Stream API 可以声明性地通过 parallel() 与 sequential() 在并行流与顺序流 之间进行切换。

为什么使用 Lambda 表达式

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以 传递的代码

(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

调用 Runable 接口

匿名内部类

unnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我爱北京天安门");
            };
//Lamdba表达式写法
Runnable r2 = () -> System.out.println("hi Lambda!");

使用Comparator接口

//未使用
Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
//Lambda表达式的写法
        Comparator<Integer> com2 = (o1,o2) -> Integer.compare(o1,o2);
//方法引用
        Comparator<Integer> com3 = Integer :: compare;

Lambda 表达式:语法

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操 作符。


这个操作符为 “->” , 该操作符被称为 Lambda 操作符 或箭头操作符。


它将 Lambda 分为两个部分:


左侧:指定了 Lambda 表达式需要的参数列表


右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能。

语法格式一:无参数,无返回值

                     () -> System.out.println("Hello Lambda!");

语法格式二:有一个参数,并且无返回值

                     (x) -> System.out.println(x)

语法格式三:若只有一个参数,小括号可以省略不写

                     x -> System.out.println(x)

语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

                       Comparator<Integer> com = (x, y) -> {

                               System.out.println("函数式接口");

                               return Integer.compare(x, y);

                               };

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

              Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,

因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

              (Integer x, Integer y) -> Integer.compare(x, y);

类型推断

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。


Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序 的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于 上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

总结

Lambda 表达式使用总结

-> 左边:lambda 形参列表的参数类型可以省略(类型推断);

如果 lambda 形参列表只有一个参数,其一对 () 也可以省略

-> 右边:lambda 体应该使用一对 {} 包裹;

如果 lambda 体只有一条执行语句(可能是 return 语句),省略这一对 {} 和 return 关键字

Lamdba表达式总结

Lambda 表达式的本质:作为函数式接口的实例


如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。我们可以在一个接口上使用

@FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。

因此以前用匿名实现类表示的现在都可以用 Lambda 表达式来写。

总代码

    //语法格式一:无参,无返回值
    @Test
    public void test1(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("感谢大家");
            }
        };
        r1.run();
        System.out.println("***********************");
        Runnable r2 = () -> {
            System.out.println("大家好");
        };
        r2.run();
    }
    //语法格式二:Lambda 需要一个参数,但是没有返回值。
    @Test
    public void test2(){
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("谎言和誓言的区别是什么?");
        System.out.println("*******************");
        Consumer<String> con1 = (String s) -> {
            System.out.println(s);
        };
        con1.accept("一个是听得人当真了,一个是说的人当真了");
    }
    //语法格式三:Lambda 若只需要一个参数时,参数的小括号可以省略
    @Test
    public void test5(){
        Consumer<String> con1 = (s) -> {
            System.out.println(s);
        };
        con1.accept("一个是听得人当真了,一个是说的人当真了");
        System.out.println("*******************");
        Consumer<String> con2 = s -> {
            System.out.println(s);
        };
        con2.accept("一个是听得人当真了,一个是说的人当真了");
    }
//语法格式四:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
    @Test
    public void test6(){
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare(12,21));
        System.out.println("*****************************");
        Comparator<Integer> com2 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(12,6));
    }
//语法格式五:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
    @Test
    public void test7(){
        Comparator<Integer> com1 = (o1,o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare(12,6));
        System.out.println("*****************************");
        Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
        System.out.println(com2.compare(12,21));
    }
//语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
   @Test
    public void test3(){
        Consumer<String> con1 = (String s) -> {
            System.out.println(s);
        };
        con1.accept("一个是听得人当真了,一个是说的人当真了");
        System.out.println("*******************");
        Consumer<String> con2 = (s) -> {
            System.out.println(s);
        };
        con2.accept("一个是听得人当真了,一个是说的人当真了");
    }

本章笔记是观看尚硅谷的java8特性的视频总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
17小时前
|
Java API
Java 8新特性之Lambda表达式与Stream API
本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,可以使代码更简洁、易读。Stream API是一种处理数据的新方式,可以让我们更方便地对集合进行操作。通过学习这两个特性,我们可以编写出更简洁、高效的Java代码。
|
1天前
|
Java 编译器
【JAVA学习之路 | 进阶篇】Lambda表达式
【JAVA学习之路 | 进阶篇】Lambda表达式
|
1天前
|
Java 编译器 C语言
java类和对象的基础特性-2
java类和对象的基础特性
6 0
|
2天前
|
Java 数据处理
Java运算符与表达式详解
Java运算符与表达式详解
|
2天前
|
Java
Java程序设计基础—表达式及运算符的优先级
Java程序设计基础—表达式及运算符的优先级
|
2天前
|
分布式计算 Java 程序员
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第21天】本文主要介绍了Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8引入的一种新的编程方式,它允许我们将函数作为参数传递给其他方法。而Stream API则是一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁易读。
|
3天前
|
Java 程序员 API
Java 8 Lambda 表达式和Stream API:概念、优势和实战应用
【5月更文挑战第20天】在Java 8中,Lambda 表达式和Stream API是两个非常强大的特性,它们显著改变了Java程序员处理数据和编写代码的方式。本篇技术文章将深入探讨这些特性的概念、优点,并提供实战示例,帮助理解如何有效地利用这些工具来编写更简洁、更高效的代码。
22 6
|
6天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
16 0
|
8天前
|
Java API
Java 8新特性之Lambda表达式与Stream API实践指南
【5月更文挑战第15天】 随着Java语言的不断发展,Java 8作为一个重要的版本,引入了许多令人兴奋的新特性。其中,Lambda表达式和Stream API是Java 8最受关注的两个特性。本文将深入探讨Lambda表达式的基本概念、语法和使用场景,以及如何结合Stream API实现更加简洁、高效的代码编写。通过实例演示,帮助读者快速掌握这两个新特性,提高Java编程能力。
|
8天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
45 2