专栏首页Spring专栏最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
原创

最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)

最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)

在这里插入图片描述

简介

Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我所接触到的,像我那时候一样,追求船新版本,一上来就去学java14的东西,当成一个爱好还行,重心还是要放在实用上

过滤

需求:我需要过滤高考分数大于500的人

首先,新建一个内部类

    static class Student{
        private String name;
        private Integer score;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name!=null ? name.trim() : null;
        }

        public Integer getScore() {
            return score;
        }

        public void setScore(Integer score) {
            this.score = score;
        }

        public Student(String name, Integer score) {
            this.name = name;
            this.score = score;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    "}\n";
        }
    }

使用IntStream遍历快速初始化一批值

    public static void main(String[] args) {
      List<Student> studentList =  IntStream.rangeClosed(0,20)
                .mapToObj(i -> new Student("Java Pro"+i,490+i))
                .collect(Collectors.toList());
    }

过滤出分数大于500的并输出

        List<Student> studentGiao = studentList.stream()
              .filter(student -> student.score > 500)
              .collect(Collectors.toList());
        System.out.println(studentGiao.toString());

输出:

[Student{name='Java Pro11', score=501}
, Student{name='Java Pro12', score=502}
, Student{name='Java Pro13', score=503}
, Student{name='Java Pro14', score=504}
, Student{name='Java Pro15', score=505}
, Student{name='Java Pro16', score=506}
, Student{name='Java Pro17', score=507}
, Student{name='Java Pro18', score=508}
, Student{name='Java Pro19', score=509}
, Student{name='Java Pro20', score=510}
]

日常求和

需要考虑到为空和为0的情况

package com.github.gleans;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class LambdaLearning {
    public static void main(String[] args) {
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        double resNum = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .sum();
        System.out.println(resNum);
    }
}

map是重新指向一个对象,把->右侧的对象赋予,此处判断若num为null则赋予0值

注意,这里不可给null使用filter过滤掉,否则全为null的情况,会报空指针异常

扩展计算

    public static void testTwo(){
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        DoubleSummaryStatistics number = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .summaryStatistics();
        System.out.println("最大值:"+number.getMax());
        System.out.println("最小值:"+number.getMin());
        System.out.println("平均值:"+number.getAverage());
    }

输出

最大值:5.6
最小值:0.0
平均值:2.6953333333333336

reduce简单使用

    public static void main(String[] args) {
        testOne();
    }

    public static void testOne(){
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 这里的 10 相当于初始值
        int sum = numbers
                .stream()
                .reduce(10, Integer::sum);
        System.out.println(sum);
    }

Collectors.groupingBy

根据年龄分组 package com.github.gleans;import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;public class SumWage { public static void main(String[] args) { List<UserDemo> userDemoList = new ArrayList<UserDemo>() {{ add(new UserDemo(20, "jason", BigDecimal.valueOf(1000000))); add(new UserDemo(22, "yasuo", BigDecimal.valueOf(2000000))); add(new UserDemo(22, "ekko", BigDecimal.valueOf(100))); }}; Map<Integer, List<UserDemo>> UserDemoMapByAge = userDemoList.stream() .collect(Collectors.groupingBy(UserDemo::getAge)); System.out.println(UserDemoMapByAge.toString()); }static class UserDemo { private int age; private String username; private BigDecimal wage; public UserDemo(int age, String username, BigDecimal wage) { this.age = age; this.username = username; this.wage = wage; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public BigDecimal getWage() { return wage; } public void setWage(BigDecimal wage) { this.wage = wage; } @Override public String toString() { return "UserDemo{" + "age=" + age + ", username='" + username + '\'' + ", wage=" + wage + '}'; } }}输出

{20=[UserDemo{age=20, username='jason', wage=1000000}], 22=[UserDemo{age=22, username='yasuo', wage=2000000}, UserDemo{age=22, username='ekko', wage=100}]}

json化观看观看更为直观

{
	20:[
		{
			"age":20,
			"username":"jason",
			"wage":1000000
		}
	],
	22:[
		{
			"age":22,
			"username":"yasuo",
			"wage":2000000
		},
		{
			"age":22,
			"username":"ekko",
			"wage":100
		}
	]
}

进阶计算 Collectors.summarizingDouble

Map<Integer, DoubleSummaryStatistics> userAvgWageByAge = userDemoList.stream()
                .collect(Collectors.groupingBy(UserDemo::getAge, Collectors.summarizingDouble(s -> s.getWage().doubleValue())));

userAvgWageByAge.forEach((k, v) -> System.out.println(String.format("年龄:%d,平均工资:%f", k, v.getAverage())));

数组快速转为List

Stream.of(1, 2, 3, 4).collect(Collectors.toList())

结论

后续会学习更多关于Lambda的操作,日积月累...一定会成为一个秃头的程序猿

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于postman测试接口(整套接口测试)

    js获取常用时间链接:https://www.yuque.com/ekko/front-dev/bpvn6x

    拾荒者的笔记
  • SpringBoot2.x与MongoDB集成(十)

    介绍MongoDB与Spring Boo集成,并通过MongoRepository以及MongoTemplate来执行CRUD操作。

    拾荒者的笔记
  • SpringBoot2.x快速入门指南(一)

    demo.zip解压之后记得复制下demo文件夹放的路径 在此用的开发工具是IntelliJ IDEA 下面是导入流程: IDEA里点击File -> Open...

    拾荒者的笔记
  • Java 参数传递是值传递还是引用传递?

    首先把结论表明,Java 的参数传递是值传递,因为有部分细节让人引起误解以为是引用传递,故我们写两个例子来举例探讨。

    萬物並作吾以觀復
  • Java面向对象基础(二)

    1.构造器: 构造函数在一个类没有写任何的构造函数的时候,系统会生成一个默认的空参数构造函数,这个构造函数的修饰符就是类的修饰符,当我们定义了一个构造函数,默认...

    lwen
  • Java——深入分析类与对象(封装性、构造方法与匿名对象、简单Java类开发原则)

    Java中所有面向对象的概念都是以类与对象的关系为主,下面用一个程序说明为什么要提供有封装性。

    Winter_world
  • Java中Comparable和Comparator

      Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序功能。实现了Comparable接口的对象的列表或数组可以通过C...

    java乐园
  • 浅谈NumPy和Pandas库(一)

    机器学习、深度学习在用Python时,我们要用到NumPy和Pandas库。今天我和大家一起来对这两个库的最最基本语句进行学习。希望能起到抛砖引玉的作用...

    IT派
  • Java自动化测试(Maven 8)

    待转化:[{"name": "张三","age": 18},{"name": "李四","age": 16}]

    zx钟
  • Java源码系列(1):Comparable和Comparator的区别

    在讲Comparable和Comparator区别之前,先补充一个知识点。 先看代码: Person类

    陈琛

扫码关注云+社区

领取腾讯云代金券