Java学习十四—Java8特性之Lambda表达式

一、简介

Java 8 引入了 Lambda 表达式,它是一种更简洁、更便于使用的函数式编程特性。Lambda 表达式允许将函数作为方法的参数(函数式接口的实例)传递给某个方法,或者将代码像数据一样进行传递。

555555

lambda是一个匿名函数,我们可以吧lambda表达式理解为是一段可以传递的代码。使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

lambda接口的实质:作为函数式接口的实例,关键是这个匿名内部类的简化,省略。

二、语法

2.1基本语法

Lambda 表达式的基本语法如下:

 

rust

复制代码

(parameters) -> expression 或者 (parameters) -> { statements; }

其中:

  • 参数列表:可以为空,也可以包含一个或多个参数。例如 (int a, int b)​ 或者 (String s)​。

  • 箭头 -> ​:箭头将参数列表与 Lambda 表达式的主体分隔开来。

  • 主体

    • 如果主体只有一条语句,可以直接写表达式,不需要大括号 {}​。
    • 如果主体有多条语句,需要使用大括号 {}​ 将语句块括起来。

2.2Lambda表达式中推荐变量名

在Lambda表达式中,变量名的选择同样应该考虑可读性和代码的清晰度。以下是一些在Lambda表达式中常用的推荐变量名:

 整理了这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处】即可免费获取

  1. e​: 通常用于表示集合中的元素。
  2. x​, y​, z​: 用作通用的变量名,可以表示任意类型的对象。
  3. p​, q​: 可以用于表示方法的参数。
  4. i​, j​, k​: 用于表示循环计数器。
  5. result​, output​: 用于表示Lambda表达式的返回值。
  6. predicate​: 表示一个谓词(Predicate)参数,用于筛选操作。
  7. consumer​: 表示一个消费者(Consumer)参数,用于对元素进行处理。
  8. function​: 表示一个函数(Function)参数,用于转换或映射操作。
  9. supplier​: 表示一个供应者(Supplier)参数,用于生成结果或对象。

这些变量名是一种约定俗成的习惯,使用它们可以提高代码的可读性和可维护性。当然,具体的变量名选择仍然取决于上下文和个人偏好,关键是确保变量名能够准确地描述其含义和作用

在Lambda表达式中,你可以使用任何合法的标识符作为变量名,包括使用o​来表示集合中的元素。然而,建议在可读性和代码清晰度方面选择更有描述性的变量名。

选择一个有意义的变量名可以使代码更易于理解和维护。在表示集合中的元素时,通常建议选择具有描述性的名称,以便更清晰地表示元素的含义。

例如,如果集合中的元素是商品对象,则可以将变量名命名为product​;如果集合中的元素是订单对象,则可以将变量名命名为order​。这样可以提高代码的可读性,使其他人更容易理解你的代码意图。

 

ini

复制代码

List<Product> products = ... products.forEach(product -> {    // 对每个商品进行操作 }); ​

2.3示例 1:简单的输出

 

csharp

复制代码

// 无参数的Lambda表达式 () -> System.out.println("Hello, Lambda!");

2.4示例 2:带参数的Lambda表达式

 

arduino

复制代码

// 带一个参数的Lambda表达式 (String s) -> System.out.println(s) ​ // 带两个参数的Lambda表达式 (int a, int b) -> a + b

2.5示例 3:带返回值的Lambda表达式

 

css

复制代码

// Lambda表达式的主体是一个表达式,直接返回结果 (int a, int b) -> a * b ​ // Lambda表达式的主体是一个代码块,可以包含多条语句 (int a, int b) -> {    if (a > b)        return a;    else        return b; }

三、示例

3.1Runnable接口案例

传统方式

 

typescript

复制代码

import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; ​ @SpringBootTest class Lamada01ApplicationTests { ​    @Test    void contextLoads() {   } ​    @Test    public void test01(){        Runnable r1=new Runnable() {            @Override            public void run() {                System.out.println("好好学习,天天向上");           }       }; ​        r1.run();   } }

image-20230629094511338

lambda方式

 

csharp

复制代码

   @Test    public void test02(){        Runnable r2=()-> System.out.println("北京天安门");        r2.run();   }

image-20230629094924905

分析

image-20230629095027018

image-20230629105139739

3.2比较大小案例

传统方式

 

vbnet

复制代码

   @Test    public void test03(){        Comparator<Integer> comparator=new Comparator<Integer>() {            @Override            public int compare(Integer o1, Integer o2) {                return Integer.compare(o1,o2);           }       }; ​        int compare = comparator.compare(12, 21);        System.out.println(compare);   }

image-20230629101751118

lambda方式

 

ini

复制代码

   @Test    public void test04(){        Comparator<Integer> comparator=(o1,o2)->Integer.compare(o1,o2); ​        int compare = comparator.compare(32, 35);        System.out.println(compare); ​   }

image-20230629101822791

分析

image-20230629102019605

3.3Consumer案例

传统方式

 

typescript

复制代码

   @Test    public void test05(){        Consumer<String> consumer=new Consumer<String>() {            @Override            public void accept(String s) {                System.out.println(s);           }       }; ​        consumer.accept("25533/"); ​   }

image-20230629104303469

lambda方式

 

csharp

复制代码

   public void test06(){        Consumer<String> consumer=s -> System.out.println(s); ​        consumer.accept("/85572");   }

image-20230629104208082

分析

image-20230629104543828

image-20230629103612764

image-20230629103652321

3.4排序案例

我们先来看一段老版本的示例代码,其对一个含有字符串的集合进行排序:Collections 工具类提供了静态方法 sort 方法,入参是一个 List 集合,和一个 Comparator 比较器,以便对给定的 List 集合进行 排序。上面的示例代码创建了一个匿名内部类作为入参,这种类似的操作在我们日常的工作中随处可见。

 

java

复制代码

import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; ​ public class HelloWorld{ ​     public static void main(String []args){            List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");            Collections.sort(names, new Comparator<String>() {            @Override            public int compare(String a, String b) {                return a.compareTo(b);           }       });            System.out.println(names);         } }

image-20230628182340312

Lambda 表达式

 

java

复制代码

import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; ​ public class HelloWorld{ ​     public static void main(String []args){            List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");                Collections.sort(names, (String a, String b) -> {            return a.compareTo(b);       });                System.out.println(names);         } }

image-20230628182557151

分析

 

typescript

复制代码

   @Test    public void Test07(){        List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");        Collections.sort(names, new Comparator<String>() {            @Override            public int compare(String o1, String o2) {                return o1.compareTo(o2);           }       }); ​        System.out.println(names);   }

image-20230629110800036

 

arduino

复制代码

   @Test    public void Test08(){        List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");        Collections.sort(names, (String o1,String o2)->{            return o1.compareTo(o2);       } ); ​        System.out.println(names);   }

image-20230629182101282

image-20230629182215152

3.5使用 Lambda 表达式与 Streams API

Java 8 的 Streams API 允许你以声明性方式处理集合。以下是使用 Lambda 表达式过滤和处理集合的示例:

 

scss

复制代码

List<String> filteredNames = names.stream()  // 创建 Stream   .filter(name -> name.length() > 4)        // 使用 Lambda 表达式过滤   .collect(Collectors.toList());             // 收集结果 System.out.println(filteredNames); // 输出 [Peter, Kim]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值