java8新特性-Lambda

简介: java8新特性-Lambda

什么是Lambda表达式

Lambda 表达式是 Java 8 引入的一种新的语法特性,它可以使得代码更加简洁、易读,并且支持函数式编程。Lambda 表达式实际上就是一个匿名方法,它可以作为参数传递给方法或者存储在变量中。

Lambda表达式规范

基本语法

Lambda 表达式由参数列表、箭头符号和函数体组成。

(参数列表) -> 函数体

参数列表

Lambda 表达式可以有零个或多个参数。如果没有参数,可以使用空括号表示 ();如果只有一个参数,可以省略括号;如果有多个参数,需要使用逗号将它们分隔开。

() -> System.out.println("Hello")

x -> x * x

(x, y) -> x + y

函数体

Lambda 表达式的函数体可以是一个表达式,也可以是一个语句块。如果函数体只有一条表达式,可以直接写在箭头后面;如果函数体包含多条语句,需要使用大括号 {} 将它们括起来,并使用分号 ; 分隔。

x -> x * x

(x, y) -> { int sum = x + y; System.out.println(sum); }

类型推断:Lambda 表达式中的参数类型可以根据上下文进行推断,不需要显式地指定类型。编译器会根据参数的使用情况来确定参数的类型。

(x, y) -> x + y

注意事项

Lambda 表达式只能用于函数式接口,即只包含一个抽象方法的接口。在使用 Lambda 表达式时,需要根据函数式接口的抽象方法定义来确定参数列表和返回值类型

如何定义函数接口

定义一个函数接口需要满足以下两点:

1.保证接口中只能有一个抽象方法

2.使用@FunctionalInterface注解标记该接口为函数接口

@FunctionalInterface
public interface MyInterfaceByJava8 {
  
    void add();//只能存在一个抽象方法
 
 
}

使用Lambda调用无参函数

首先定义一个函数接口

@FunctionalInterface
public interface FuncInterface {
  void add();
}

接着实现并调用这个无参函数,这里展示传统的匿名内部类调用法,跟Lambda调用法。

public static void main(String [] args){
    //使用匿名内部类调用
    new FuncInterface(){
      
      @Override
      public void add() {
        System.out.println("匿名内部类实现调用");
      }
      
    }.add();
    
    //使用Lambda调用
    ((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();
    
  }

可以看到使用Lambda代码更加简洁优雅

使用Lambda调用有参函数

定义函数接口

@FunctionalInterface
public interface FuncInterface2 {
  int del(int id);
}

实现并调用

public static void main(String [] args){
    
    int id=101;
    //使用匿名内部类调用
    int result1=new FuncInterface2(){
 
      @Override
      public int del(int id) {
        System.out.println("匿名内部类实现调用:"+id);
        return 1;
      }
      
    }.del(id);
      
    //使用Lambda调用
    int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
    
    
    System.out.println(result1);
    System.out.println(result2);
    
  }

使用Lambda的精简写法

当函数参数仅有一个时可以省略括号(没有参数时必须用空括号,不能省

//普通写法
int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
 
//精简写法--省略参数园括号
int result2=((FuncInterface2)p->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);

当函数体只有一条语句可以省略{}

//普通写法
((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();
 
//精简写法--省略函数体括号
((FuncInterface)()->System.out.println("Lambda实现调用")).add();

当函数体仅有一条语句且是返回语句时,可以省略return

//普通写法
int result2=((FuncInterface2)p->return 1).del(id);
 
//精简写法--省略return
int result2=((FuncInterface2)p->1).del(id);

使用Lambda实现集合遍历

public static void main(String [] args){
    List<String> names=Arrays.asList("小明","小黑","小红");
    
    //传统遍历--增强for
    for(String name:names){
      System.out.println(name);
    }
    
    //传统遍历--匿名内部类
    names.forEach(new Consumer<String>(){
 
      @Override
      public void accept(String name) {
        System.out.println(name);
      }
      
    });
    
    //Lambda表达式遍历
    names.forEach(name->System.out.println(name));
    
  }

使用Lambda实现集合排序

将学生集合的学生按照年龄排序

public static void main(String [] args){
    List<Student> students1=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
    List<Student> students2=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
    //传统排序--匿名内部类
    students1.sort(new Comparator<Student>(){
 
      @Override
      public int compare(Student stu1, Student stu2) {
        return stu1.getAge()- stu2.getAge();
      }});
 
    //Lambda
    students2.sort((stu1,stu2)->stu1.getAge()-stu2.getAge());//省略return
    
    
    
    
    System.out.println(students1);
    System.out.println(students2);
    
    
  }

使用Lambda实现线程调用

public static void main(String [] args){
    //传统调用
    new Thread(new Runnable(){
 
      @Override
      public void run() {
        System.out.println("子线程运行了");
      }
      
    }).start();
    
    //Lambda
    new Thread(()->System.out.println("子线程运行了")).start();
  }
目录
相关文章
|
5天前
|
Java 程序员 API
Java中的Lambda表达式:简化你的代码
【7月更文挑战第10天】Lambda表达式,这一Java 8的闪亮特性,为开发者提供了一种更为简洁、灵活的编程方式。本文将探讨Lambda表达式如何优化代码结构,提升开发效率,以及在实际项目中应用的一些实例。我们将从基础语法入手,逐步深入到高级用法,最后讨论其性能影响,旨在帮助读者全面理解并有效利用Lambda表达式。
31 20
|
4天前
|
安全 Java 开发者
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
12 1
|
6天前
|
Java API 开发者
Java中的Lambda表达式与函数式编程
【7月更文挑战第8天】在探索Java的现代编程范式时,Lambda表达式和函数式编程的概念不断涌现。本文将深入探讨Lambda表达式如何简化代码、提升可读性,并展示其在Java 8及以上版本中实现函数式编程的关键作用。我们将通过实例分析Lambda表达式的语法结构,讨论其在集合操作、线程处理等方面的应用,并对比传统匿名类的方式,揭示Lambda表达式带来的编程效率革命。最后,我们将展望未来函数式编程在Java语言发展中的潜在影响。
|
6天前
|
Java API 开发者
Java中的Lambda表达式和函数式编程
在Java的世界中,Lambda表达式的引入标志着一个新时代的开始。它不仅仅是语法糖,而是打开了一扇通向函数式编程的大门。本文将深入探讨Lambda表达式的概念、优势以及如何在Java中有效利用它来提升代码的简洁性和可读性。通过实例分析,我们将看到如何从传统的命令式编程过渡到更加现代的函数式编程范式。
|
7天前
|
Java 开发者
探索Java中的Lambda表达式
【7月更文挑战第8天】本文将深入探讨Java 8引入的Lambda表达式,这一特性如何改变了我们编写和理解代码的方式。我们将从基础语法开始,逐步深入到性能优化和实际应用案例,旨在为读者提供全面而实用的视角。
11 2
|
7天前
|
Java
Java里面的10个Lambda表达式必须掌握,提高生产力
Java里面的10个Lambda表达式必须掌握,提高生产力
11 1
|
10天前
|
存储 并行计算 Java
Java中的函数式编程与Lambda表达式探索
Java中的函数式编程与Lambda表达式探索
|
10天前
|
并行计算 Java API
Java中的函数式编程实战与Lambda表达式应用
Java中的函数式编程实战与Lambda表达式应用
|
3天前
|
Java 大数据 API
Java语言的核心知识点与特性
Java 是一种广泛使用的编程语言,自 1995 年发布以来,它已经成为了企业级应用开发、移动应用开发、大数据处理和云计算等领域的主流技术。
10 0
|
3天前
|
Java 编译器 API
Java中的Lambda表达式:简化代码,提升性能
在Java 8中,Lambda表达式的引入为开发者提供了一种更加简洁、灵活的编程方式。本文将深入探讨Lambda表达式的概念、语法、使用场景及其在Java中的应用示例,帮助读者更好地理解和掌握这一强大工具,从而优化代码结构,提高开发效率。