Java 面试笔试题 - Stream 和 Lambda 表达式的使用

1 篇文章 0 订阅

请按以下步骤实现代码

  • 创建一个新的 JDK 1.8 项目,能运行 main 方法即可

  • 新建一个 Record 类,类中包含以下属性 level, teacher, student

  • 构建一个 List 集合,集合中包含 8 个 Record 对象, Record 对象包含以下属性:
    Level(年级),Teacher(老师姓名),Student(学生姓名)

    每个对象的属性值如下:

LevelTeacherStudent
L1LiS1
L1WangS2
L1WangS3
L2LiS4
L2LiS5
L2WangS6
L3WangS7
L3WangS8

然后实现以下数据统计,要求使用 Java 8 的 Stream 和 Lambda 表达式

  • 使用 Stream 集合操作统计每个年级有多少名学生,打印在输出窗口即可,输出效果:
    {L1=3, L2=3, L3=2}

  • 使用 filter 方法进行过滤,列出老师 Li 的所有学生姓名,输出效果:
    {Li=[S1, S4, S5]}

  • 列出每个老师,每个年级的学生数量,输出效果:
    {Wang={L1=2, L2=1, L3=2}, Li={L1=1, L2=2}}

可参考 Java 文档:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html

答案

新建一个 TestRecord 类,把以下代码赋值复制进入

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TestRecord {
    public static void main(String[] args) {
        List<Record> list = new ArrayList<>();
        list.add(new Record("L1", "Li", "S1"));
        list.add(new Record("L1", "Wang", "S2"));
        list.add(new Record("L1", "Wang", "S3"));
        list.add(new Record("L2", "Li", "S4"));
        list.add(new Record("L2", "Li", "S5"));
        list.add(new Record("L2", "Wang", "S6"));
        list.add(new Record("L3", "Wang", "S7"));
        list.add(new Record("L3", "Wang", "S8"));
        // 使用 Stream 集合操作统计每个年级有多少名学生,打印在输出窗口即可,输出效果:  {L1=3, L2=3, L3=2}
        Map<String, Long> record1 = list.stream().collect(Collectors.groupingBy(Record::getLevel, Collectors.counting()));
        System.out.println(record1);
        // 使用 filter 方法进行过滤,列出老师 Li 的所有学生姓名,输出效果:  {Li=[S1, S4, S5]}
        Map<String, List<String>> result = list.stream()
                .filter(record -> "Li".equals(record.getTeacher()))
                .collect(Collectors.groupingBy(Record::getTeacher, Collectors.mapping(Record::getStudent, Collectors.toList())));
        System.out.println(result);
        // 列出每个老师,每个年级的学生数量
        Map<String,Map<String,Long>> collect = list.stream().collect(Collectors.groupingBy(Record::getTeacher,Collectors.groupingBy(Record::getLevel,Collectors.counting())));
        System.out.println(collect);
    }
}

class Record {
    private String level;
    private String teacher;
    private String student;

    public Record() {
    }
    public Record(String level, String teacher, String student) {
        this.level = level;
        this.teacher = teacher;
        this.student = student;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }

    public String getTeacher() {
        return teacher;
    }

    public void setTeacher(String teacher) {
        this.teacher = teacher;
    }

    public String getStudent() {
        return student;
    }
    public void setStudent(String student) {
        this.student = student;
    }
    @Override
    public String toString() {
        return "Record{" +
                "level='" + level + '\'' +
                ", teacher='" + teacher + '\'' +
                ", student='" + student + '\'' +
                '}';
    }
}

结果

{L1=3, L2=3, L3=2}
{Li=[S1, S4, S5]}
{Wang={L1=2, L2=1, L3=2}, Li={L1=1, L2=2}}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师小师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值