【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!

简介: 不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下。于是问冰河能否给几个Lambda表达式的典型使用示例。于是乎,便有了这篇文章。

案例一

需求

调用Collections.sort()方法,通过定制排序比较两个Employee(先比较年龄,年龄相同按姓名比较),使用Lambda表达式作为参数传递。

实现

这里,我们先创建一个Employee类,为了满足需求,我们在Employee类中定义了姓名、年龄和工资三个字段,如下所示。

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
    private static final long serialVersionUID = -9079722457749166858L;
    private String name;
    private Integer age;
    private Double salary;
}

接下来,我们在TestLambda类中定义一个成员变量employees,employees变量是一个List集合,存储了Employee的一个列表,如下所示。

protected List<Employee> employees = Arrays.asList(
    new Employee("张三", 18, 9999.99),
    new Employee("李四", 38, 5555.55),
    new Employee("王五", 60, 6666.66),
    new Employee("赵六", 8, 7777.77),
    new Employee("田七", 58, 3333.33)
);

前期的准备工作完成了,接下来,我们就可以实现具体的业务逻辑了。

@Test
public void test1(){
    Collections.sort(employees, (e1, e2) -> {
        if(e1.getAge() == e2.getAge()){
            return e1.getName().compareTo(e2.getName());
        }
        return Integer.compare(e1.getAge(), e2.getAge());
    });
    employees.stream().forEach(System.out::println);
}

上述代码比较简单,我就不赘述具体逻辑了。运行test1方法,得出的结果信息如下所示。

Employee(name=赵六, age=8, salary=7777.77)
Employee(name=张三, age=18, salary=9999.99)
Employee(name=李四, age=38, salary=5555.55)
Employee(name=田七, age=58, salary=3333.33)
Employee(name=王五, age=60, salary=6666.66)

如果想倒叙输出如何处理呢,只需要在将return Integer.compare(e1.getAge(), e2.getAge());修改成-return Integer.compare(e1.getAge(), e2.getAge());即可,如下所示。

@Test
public void test1(){
    Collections.sort(employees, (e1, e2) -> {
        if(e1.getAge() == e2.getAge()){
            return e1.getName().compareTo(e2.getName());
        }
        return -Integer.compare(e1.getAge(), e2.getAge());
    });
    employees.stream().forEach(System.out::println);
}

再次运行test1方法,得出的结果信息如下所示。

Employee(name=王五, age=60, salary=6666.66)
Employee(name=田七, age=58, salary=3333.33)
Employee(name=李四, age=38, salary=5555.55)
Employee(name=张三, age=18, salary=9999.99)
Employee(name=赵六, age=8, salary=7777.77)

结果符合我们的需求。

案例二

需求

1.声明函数式接口,接口中声明抽象方法public String getValue(String str);

2.声明类TestLambda,类中编写方法使用接口作为参数,将一个字符串转换为大写,并作为方法的返回值。

3.再将一个字符串的第2个和第4个索引位置进行截取子串。

实现

首先,创建一个函数式接口MyFunction,在MyFunction接口上加上注解@FunctionalInterface标识接口是一个函数式接口。如下所示。

@FunctionalInterface
public interface MyFunction {
    public String getValue(String str);
}

在TestLambda类中声明stringHandler方法,参数分别为待处理的字符串和函数式接口的实例,方法中的逻辑就是调用函数式接口的方法来处理字符串,如下所示。

public String stringHandler(String str, MyFunction myFunction){
    return myFunction.getValue(str);
}

接下来,我们实现将一个字符串转换为大写的逻辑,如下所示。

@Test
public void test2(){
    String value = stringHandler("binghe", (s) -> s.toUpperCase());
    System.out.println(value);
}

运行test2方法,得出如下的结果信息。

BINGHE

我们再来实现字符串截取的操作,如下所示。

@Test
public void test3(){
    String value = stringHandler("binghe", (s) -> s.substring(1, 3));
    System.out.println(value);
}

注意:需求中是按照第2个和第4个索引位置进行截取子串,字符串的下标是从0开始的,所以这里截取字符串时使用的是substring(1, 3),而不是substring(2, 4),这也是很多小伙伴容易犯的错误。

另外,使用上述Lambda表达式形式,可以实现字符串的任意处理,并返回处理后的新字符串。

运行test3方法,结果如下所示。

in

案例三

需求

1.声明一个带两个泛型的函数式接口,泛型类型为,其中,T作为参数的类型,R作为返回值的类型。

2.接口中声明对象的抽象方法。

3.在TestLambda类中声明方法。使用接口作为参数计算两个long型参数的和。

4.再就按两个long型参数的乘积。

实现

首先,我们按照需求定义函数式接口MyFunc,如下所示。

@FunctionalInterface
public interface MyFunc<T, R> {
    R getValue(T t1, T t2);
}

接下来,我们在TestLambda类中创建一个处理两个long型数据的方法,如下所示。

public void operate(Long num1, Long num2, MyFunc<Long, Long> myFunc){
    System.out.println(myFunc.getValue(num1, num2));
}

我们可以使用下面的方法来完成两个long型参数的和。

@Test
public void test4(){
    operate(100L, 200L, (x, y) -> x + y);
}

运行test4方法,结果如下所示。

300

实现两个long型数据的乘积,也很简单。

@Test
public void test5(){
    operate(100L, 200L, (x, y) -> x * y);
}

运行test5方法,结果如下所示。

20000

看到这里,我相信很多小伙伴已经对Lambda表达式有了更深层次的理解。只要多多练习,就能够更好的掌握Lambda表达式的精髓。

相关文章
|
8月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
301 0
|
9月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
551 211
|
10月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
402 0
|
10月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
892 0
|
10月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
468 1
|
10月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
960 1
|
10月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
503 0
|
10月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
458 1