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();
  }
目录
相关文章
|
2月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
64 0
|
3月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
371 211
|
4月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
171 1
|
4月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
453 0
|
4月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
101 0
|
4月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
162 1
|
4月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
221 1
|
4月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
127 2