Lambda表达式的应用

Lambda表达式的应用

优点:

  1. 简洁。

  2. 非常容易并行计算。

  3. 可能代表未来的编程趋势。

  4. 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。

缺点:

  1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)

  2. 不容易调试。

  3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。

  4. 在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt

Stream的使用分为两种类型:

Intermediate,一个Stream可以调用0到多个Intermediate类型操作,每次调用会对Stream做一定的处理,返回一个新的Stream,这类操作都是惰性化的(lazy),就是说,并没有真正开始流的遍历。
常用操作:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel

Terminal,一个Stream只能执行一次terminal 操作,而且只能是最后一个操作,执行terminal操作之后,Stream就被消费掉了,并且产生一个结果。
常用操作:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny

Stream streamList2 = list.parallelStream();

应用:

List转Map

1、取对象的属性subDictName过滤其中的空格做为map对象的key值
Map<String, List> mapConf = userList.stream().collect(Collectors.groupingBy(User-> user.getSubDictName().replaceAll(" “,”")));
2、过滤掉空对象
List listUserNotNull = listUser.stream().distinct().filter(Objects::nonNull).collect(Collectors.toList());
3、过滤掉对象属性为空的值
List listNotNullUserPropertyFilter = listUserNotNull.parallelStream().distinct().filter(User->(StrUtil.isNotBlank(User.getTenantName())||StrUtil.isNotBlank(User.getTenantId())).collect(Collectors.toList());

取出集合符合条件的第一个元素:
/**

  • 取出年纪为25岁的人
    */
    @Test void extractAgeEQ25Success () {
    Optional optionalPeople = peoples.stream().filter(x -> x.getAge() == 25).findFirst();
    if (optionalPeople.isPresent()) System.out.println("###name1: " + optionalPeople.get().getName());

//简写
peoples.stream().filter(x -> x.getAge() == 25).findFirst().ifPresent(x -> System.out.println("###name2: " + x.getName()));
}

求集合对象数值列平均数
/**

  • 求人平均年龄
    */
    @Test void averagingAgeSuccess () {
    Double avgAge = peoples.stream().collect(Collectors.averagingInt(People::getAge));
    System.out.println(avgAge);
    }
    总结:
    当循环遍历中不需要进行数据库操作时,使用stream()或普通循环来遍历(根据实际业务情况来选择用哪个)。
    当循环遍历中(多次循环,百次以上)需要进行数据库操作时,使用parallelStream()来遍历,但是要注意多线程安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值