前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!

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

作者头像
冰河
发布2020-10-29 16:37:10
3680
发布2020-10-29 16:37:10
举报
文章被收录于专栏:冰河技术

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。

写在前面

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

案例一

需求

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

实现

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

代码语言:javascript
复制
@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的一个列表,如下所示。

代码语言:javascript
复制
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)
);

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

代码语言:javascript
复制
@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方法,得出的结果信息如下所示。

代码语言:javascript
复制
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());即可,如下所示。

代码语言:javascript
复制
@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方法,得出的结果信息如下所示。

代码语言:javascript
复制
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标识接口是一个函数式接口。如下所示。

代码语言:javascript
复制
@FunctionalInterface
public interface MyFunction {
    public String getValue(String str);
}

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

代码语言:javascript
复制
public String stringHandler(String str, MyFunction myFunction){
    return myFunction.getValue(str);
}

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

代码语言:javascript
复制
@Test
public void test2(){
    String value = stringHandler("binghe", (s) -> s.toUpperCase());
    System.out.println(value);
}

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

代码语言:javascript
复制
BINGHE

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

代码语言:javascript
复制
@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方法,结果如下所示。

代码语言:javascript
复制
in

案例三

需求

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

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

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

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

实现

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

代码语言:javascript
复制
@FunctionalInterface
public interface MyFunc<T, R> {

    R getValue(T t1, T t2);
}

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

代码语言:javascript
复制
public void operate(Long num1, Long num2, MyFunc<Long, Long> myFunc){
    System.out.println(myFunc.getValue(num1, num2));
}

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

代码语言:javascript
复制
@Test
public void test4(){
    operate(100L, 200L, (x, y) -> x + y);
}

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

代码语言:javascript
复制
300

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

代码语言:javascript
复制
@Test
public void test5(){
    operate(100L, 200L, (x, y) -> x * y);
}

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

代码语言:javascript
复制
20000

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

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Java8新特性。

最后,附上Java8新特性核心知识图,祝大家在学习Java8新特性时少走弯路。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 案例一
    • 需求
      • 实现
      • 案例二
        • 需求
          • 实现
          • 案例三
            • 需求
              • 实现
              • 写在最后
              相关产品与服务
              消息队列 CMQ
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档