专栏首页eclipse编程学会lambda表达式,能让你少敲1000行代码!

学会lambda表达式,能让你少敲1000行代码!

有一天技术总监找到了雷布斯

技术总监

一颗雷布斯,假设有这样一个业务:有一张学历表,表里面存了我们这一生中的所有学历信息,学历类型type分别是0小学、1初中、2高中、3高中、4大学、5研究生、6博士。怎样快速得到这个人的最高学历?

一颗雷布斯

总监这也太简答了

,把这个人的所有学历信息用for循环遍历一下,如果type为6,那就是最高学历。

技术总监

明天去财务结一下工资

一颗雷布斯

不是总监,我到底做错了什么?

技术总监

20年最后一个月了,还在for循环里面套if语句,用lambda表达式一行代码就搞定了!

一颗雷布斯

啥是lambda?到底啥是"拉木达"?

技术总监

想学lambda还是想找财务?

一颗雷布斯

我想学lambda,我不想找财务

01

什么是lambda表达式

1. 函数式接口

在聊起lambda表达式之前,我们不得不提起函数式接口:一个接口只包含唯一的方法,那么它就是函数式接口。例如:

public class LambdaTest {

    public static void main(String[] args) {
        Lambda lambda=new SonLambda();
        lambda.say();
    }
}

//1.一个接口只包含一个方法就是函数式接口
interface Lambda {
    void say();
}
//2.一个类实现接口,要重写这个接口的所有方法
class SonLambda implements Lambda {
    @Override
    public void say() {
        System.out.println("i love lambda");
    }
}

有时候太懒的话我们会直接写一个匿名内部类。

public class LambdaTest {
    public static void main(String[] args) {
        //2.匿名内部类: 没有子类,必须借助接口或者父类
        Lambda lambda=new Lambda() {
            @Override
            public void say() {
                System.out.println("i like lambda");
            }
        };
        lambda.say();
    }
}
//1.一个接口只包含一个方法就是函数式接口
interface Lambda {
    void say();
}

但是我们写代码肯定是越(简单)越好,这个时候Lambda表达式闪亮登场。

Lambda表达式是Java8发布的最重要的新特性,它的出现就是为了解决匿名内部类那一坨坨代码的问题,让代码看起来更简洁。

lambda 表达式的语法格式如下:

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

parameters是参数,expression是表达式。

对于上面例子中的匿名内部类,我们用Lambda表达式该怎样表示呢?

因为上面例子中匿名内部类只有一个方法,所以我们可以省略掉它的接口名和方法名。

又因为没有参数,所以我们直接可以用一个中括号表示它的方法名,然后用->指向它的方法体。如下所示:() -> {}替代了匿名内部类。

public class LambdaTest {
    public static void main(String[] args) {
        Lambda lambda=()->{
            System.out.println("i like lombda");
        };
        lambda.say();
    }
}
//1.一个接口只包含一个方法就是函数式接口
interface Lambda {
    void say();
}

那么你可能会问,带有参数的接口用lambda表达式该怎样表示呢?

如下所示:

public class LambdaTest {
    public static void main(String[] args) {
        Lambda lambda=(a,b)->{
            System.out.println("a="+a+" b="+b);
        };
        lambda.say(1,2);
    }
}
//1 一个接口只包含一个方法就是函数式接口
interface Lambda {
    void say(int a,int b);
}

02

Lambda表达式常用方法

1. forEach 遍历集合中的元素

List<String> fruits= Arrays.asList("apple", "orange", "banana");
fruits.forEach(fruit->{
           System.out.println("水果:"+fruit);
      });

2. stream流

Java8中的stream 是对集合功能的增强,它专注于对集合进行各种非常便利、高效的聚合操作,或者大批量数据操作。

3. map()

获取集合中的某一个元素,返回新的集合。记住使用map之前首先要获得集合的stream流。

public class LambdaTest {
    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"赵敏",24));
        list.add(new User(3,"周芷若",23));
        //获取这三个人的所有名字
        List<String> nameList = list.stream().map(User::getName).collect(Collectors.toList());
        //遍历所有人的名字
        nameList.forEach(name->{
            System.out.println("名字:"+name);
        });
    }
}

4. collect(Collector c)

将操作之后的结果转换为集合,Collector除了可以转为list集合,还能转为set集合,也就是不重复的集合。

public class LambdaTest {
    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"张无忌",24));
        list.add(new User(3,"周芷若",23));
        //获取这三个人的所有名字
        Set<String> set = list.stream().map(User::getName).collect(Collectors.toSet());
        //遍历所有人的名字
        set.forEach(name->{
            System.out.println("不重复的名字:"+name);
        });
    }
}

5. distinct() 去重

public class LambdaTest {
    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌01",25));
        list.add(new User(2,"张无忌01",24));
        list.add(new User(3,"赵敏",23));
        //获取这三个人的所有名字
        List<String> nameList = list.stream().map(User::getName).distinct().collect(Collectors.toList());
        //遍历所有人的名字
        nameList.forEach(name->{
            System.out.println("去重之后的名字:"+name);
        });
    }
}

6. reduce():将元素中的值以某种方式连接起来,SQL中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是 reduce 操作,因为它们接收多个值并返回一个值。

public class LambdaTest {
    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"周芷若",24));
        list.add(new User(3,"赵敏",23));
        //1.获取这三个人的年龄之和
        //2.map(w -> w.getAge()) 获取每一个人的年龄
        //3.reduce((x, y) -> x + y) 将他们的年龄相加
        //4.get() 获取最后的结果
        Integer sumAge = list.stream().map(w -> w.getAge()).reduce((x, y) -> x + y).get();
        System.out.println("这三个人的年龄之和:"+sumAge);
    }
}

7. match用法

allMatch():检查是否匹配所有元素

anyMatch(): 检查是否匹配任意元素

noneMatch(): 检查是否没有匹配元素

public class LambdaTest {
    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"周芷若",24));
        list.add(new User(3,"赵敏",23));
        boolean result01 = list.stream().allMatch(w->w.getAge()>23);
        boolean result02= list.stream().anyMatch(w->w.getAge()>23);
        boolean result03= list.stream().noneMatch(w->w.getAge()>23);
        System.out.println("所有人都大于23岁吗?:"+result01);
        System.out.println("有大于23岁的吗?:"+result02);
        System.out.println("他们没有大于23岁的吗?:"+result03);
    }
}

8. filter() 条件过滤

    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"周芷若",24));
        list.add(new User(3,"赵敏",23));
        //1.filter(w -> w.getAge() > 23) 年龄大于23
        //2.map(w -> w.getName()) 获取人的名字
        //3.获取这三个人中年龄大于23岁的人的名字的集合
        List<String> nameList = list.stream().filter(w -> w.getAge() > 23).map(w -> w.getName()).collect(Collectors.toList());
        nameList.forEach(name->{
            System.out.println("年龄大于23岁的人:"+name);
        });
    }

9. sorted() 排序

    public static void main(String[] args) {
        //新增三个人的信息
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"张无忌",25));
        list.add(new User(2,"周芷若",24));
        list.add(new User(3,"赵敏",23));
        //1.sorted(Comparator.comparing(User::getAge)) 根据某个字段排序
        //2.reversed() 从大到小排序
        List<User> users1 = list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
        System.out.println("-------------年龄从小到大排序");
        users1.forEach(user->{
            System.out.println(user.getName()+" "+user.getAge());
        });
        System.out.println("-------------年龄从大到小排序");
        List<User> users2 = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
        users2.forEach(user->{
            System.out.println(user.getName()+" "+user.getAge());
        });

    }

03

Lambda表达式常见案例

1. 案例一:获取所有用户的ID。

List<Integer> ids = list.stream().map(w -> w.getId()).collect(Collectors.toList());

2. 案例二:将所有用户的ID作为key,name作为value放到一个map里面。

Map<Integer, String> userMap = list.stream().collect(Collectors.toMap(User::getId,User::getName));

3. 案例三 :使用stream转换为集合,我们再也不用一个个去add了。

List<User> users = Stream.of(user1, user2, user3).collect(Collectors.toList());

4. 案例四:map对象转换,我们一般从数据库查数据为PO对象,返回给web端时一般为VO对象,那么这其中就涉及对象转换返回,map就提供了便利的操作。

List<UserVo> userVos = userList.stream().map(user -> {
    UserVo userVo = new UserVo();
    BeanUtils.copyProperties(user, userVo);
    return userVo;
}).collect(Collectors.toList());

5. 案例五:按照某一个属性进行分组,比如这里我们按照用户性别进行分组。

Map<Integer, List<User>> genderGroup = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.toList()));

6. 案例六:求最小、最大、平均值、求和。

int min = userList.stream().mapToInt(User::getAge).min().orElse(-1);
int max = userList.stream().mapToInt(User::getAge).max().orElse(-1);
int sum = userList.stream().mapToInt(User::getAge).sum();
double average = userList.stream().mapToInt(User::getAge).average().orElse(-1);

04

写到最后

注意:lambda表达式有个限制,那就是只能引用final或final局部变量,这就是说不能在lambda内部修改定义在域外的变量,不然会报错。

-END-

本文分享自微信公众号 - eclipse编程(eclipsecamp),作者:一颗雷布斯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学会这二十个正则表达式,能让你少些1000行代码!

    正则表达式,是一个强大且高效的文本处理工具。通常情况下,通过一段表达准确的表达式,能够非常简短、快速的实现复杂业务逻辑。 因此,正则表达式通常是一个成熟开发人员...

    小小科
  • 能让你少写1000行代码的20个正则表达式

    正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话,能够使你的开发效...

    哲洛不闹
  • 这20个正则表达式,让你少写1000行代码

    正则表达式——古老而又强大的文本处理工具。仅用一段简短的表达式语句,就能快速地实现一个复杂的业务逻辑。掌握正则表达式,让你的开发效率有一个质的飞跃。 正则表达式...

    老九君
  • 学会这二十个正则表达式,能让你少些100

    正则表达式,是一个强大且高效的文本处理工具。通常情况下,通过一段表达准确的表达式,能够非常简短、快速的实现复杂业务逻辑。

    py3study
  • 一道面试题让我重新学了一遍匿名函数

    首先祝各位节日快乐,不管有没有npy,大家还是要快乐,过节也不能停止学习。上一篇文章群友问了道3行代码的python面试题,我懵逼了...给大家说了一道Pyth...

    Python进击者
  • 由浅入深表达式树(一)创建表达式树

      为什么要学习表达式树?表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和...

    用户1153966
  • Python的高级特征你知多少?

    开篇先说,IEEE Spectrum 于9月6日发布了2019年最受欢迎的编程语言排名,无疑Python蝉联第一,成绩颇为亮眼。从前年开始,Python 就开始...

    CSDN技术头条
  • 文末送书 | Python的高级特征你知多少?

    开篇先说,IEEE Spectrum 于9月6日发布了2019年最受欢迎的编程语言排名,无疑Python蝉联第一,成绩颇为亮眼。从前年开始,Python 就开始...

    用户1737318
  • Lambda 表达式学习感受

    Lambda 表达式是从 JDK 1.8 开始的,但是很多技术的诞生其实并不是凭空出现的,而是为了解决某种问题而逐步迭代出现的。

    码农UP2U
  • Python 拓展之特殊函数

    今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 “函数式编程” 的见证,至于什么是函数式编程,不是本篇文章的重...

    编程文青李狗蛋
  • lambda与函数式——响应式Spring的道法术器

    本文来源:https://blog.csdn.net/get_set/article/details/79466402

    挨踢小子部落阁
  • 教程 | 十分钟学会函数式 Python

    函数式编程到底是什么?本文将详解其概念,同时分享怎样在 Python 中使用函数式编程。主要内容包括列表解析式和其他形式的解析式。

    昱良
  • 教程 | 十分钟学会函数式 Python

    导读:函数式编程到底是什么?本文将详解其概念,同时分享怎样在 Python 中使用函数式编程。主要内容包括列表解析式和其他形式的解析式。

    1480
  • 教程 | 十分钟学会函数式 Python

    导读:函数式编程到底是什么?本文将详解其概念,同时分享怎样在 Python 中使用函数式编程。主要内容包括列表解析式和其他形式的解析式。

    Python数据科学
  • Python的 5 种高级用法,效率提升没毛病!

    任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目,并在 stackoverflow 上寻找某个问题的答案。然后你突然发现了一...

    昱良
  • lambda与函数式

    IT架构圈
  • lambda与函数式

    前面两篇文章介绍了什么是响应式编程?和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。

    Java3y
  • Python的高级特征你知多少?来对比看看

    Python 是一种美丽的语言,它简单易用却非常强大。但你真的会用 Python 的所有功能吗?

    CDA数据分析师
  • Python的高级特征你知多少?来对比看看

    Python 是一种美丽的语言,它简单易用却非常强大。但你真的会用 Python 的所有功能吗?

    机器之心

扫码关注云+社区

领取腾讯云代金券