Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)

文章目录

Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)

💗💗💗您的点赞、收藏、评论是博主输出优质文章的的动力!!!💗💗💗

欢迎在评论区与博主沟通交流!!Java8 系列文章持续更新,大佬们关注我!种个草不亏!👇🏻 👇🏻 👇🏻

学起来,开整!Java8 BiConsumer<T, U>函数接口使用分享。

BiConsumer<T, U> 跟我们熟悉的 Consumer< T> 很像,核心思想也是一样的,两者都是表达消费的意思;

源码

BiConsumer<T, U> 提供了两个方法:

  • void accept(T t, U u):传入两个泛型参数(当然方法实现想怎么用自己玩,可以看下面示例场景);
  • BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after):可以理解为在执行 accept 方法前先执行一个前置方法,前置方法执行完成后,会接着执行 accept 方法;

源码

java 复制代码
@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);

    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}

accept 方法示例

tips: 需要配合文末示例相关代码类食用

示例一

查询所有学生的成绩:

java 复制代码
	@Test
    public void test() {
        StudentScoreDto studentScoreDto = new StudentScoreDto();
        Student student = new Student();
        this.doHandler(student, studentScoreDto, StudentAssemble::queryList, StudentAssemble::calcSort);
        System.out.println(JSONObject.toJSONString(studentScoreDto));
    }

执行结果:

示例二

查询 "张三" 同学的成绩:

java 复制代码
	@Test
    public void test() {
        StudentScoreDto studentScoreDto1 = new StudentScoreDto();
        Student student1 = new Student();
        student1.setName("张三");
        this.doHandler(student1, studentScoreDto1, StudentAssemble::queryList, StudentAssemble::calcSort);
        System.out.println(JSONObject.toJSONString(studentScoreDto1));
    }

执行结果:

andThen 方法示例

示例一

查询所有学生的成绩,并且输出第一名是哪位同学;

java 复制代码
@Test
    public void test() {
        StudentScoreDto studentScoreDto2 = new StudentScoreDto();
        Student student2 = new Student();
        this.doHandler(student2, studentScoreDto2, StudentAssemble::queryList, StudentAssemble::calcSort, StudentAssemble::findFirst);
        System.out.println(JSONObject.toJSONString(studentScoreDto2));
    }

执行结果:

示例二

查询所有学生的成绩,并且输出 "李四" 同学的排名和总分;

java 复制代码
@Test
    public void test() {
        StudentScoreDto studentScoreDto3 = new StudentScoreDto();
        studentScoreDto3.setName("李四");
        Student student3 = new Student();
        this.doHandler(student3, studentScoreDto3, StudentAssemble::queryList, StudentAssemble::calcSort, StudentAssemble::findFirst);
        System.out.println(JSONObject.toJSONString(studentScoreDto3));
    }

执行结果:

示例相关代码类

tips: 需要配合文末示例相关代码类食用

dohandler 方法

tip:注意这里是方法!!

java 复制代码
	public void doHandler(Student student,
                          StudentScoreDto dto,
                          Function<Student, List<StudentScore>> func1,
                          BiConsumer<List<StudentScore>, StudentScoreDto> func2) {
        List<StudentScore> apply = func1.apply(student);
        func2.accept(apply, dto);
    }

    public void doHandler(Student student,
                          StudentScoreDto dto,
                          Function<Student, List<StudentScore>> func1,
                          BiConsumer<List<StudentScore>, StudentScoreDto> func2,
                          BiConsumer<List<StudentScore>, StudentScoreDto> func3) {
        List<StudentScore> apply = func1.apply(student);
        func2.accept(apply, dto);
        func3.andThen(func2).accept(apply, dto);
    }

student.java

java 复制代码
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {

    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 生日
     */
    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date birthday;
    /**
     * 学号
     */
    private Integer num;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                ", num=" + num +
                '}';
    }

StudentScore.java

java 复制代码
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {

    /**
     * 名称
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成绩
     */
    private Integer score;

}

StudentScoreDto.java

java 复制代码
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScoreDto {

    /**
     * 名称
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成绩
     */
    private Integer score;
    /**
     * 个人排名
     */
    private Integer rank;
    /**
     * 全班排名
     */
    private List<StudentScoreDto> rankList;

}

StudentAssemble.java

java 复制代码
public class StudentAssemble {
    /**
     * 查询学生成绩列表
     *
     * @param student 学生实体对象
     * @return 学生成绩集合
     */
    public static List<StudentScore> queryList(Student student) {
        // 模拟查询学生信息
        List<StudentScore> studentScores = Arrays.asList(
                new StudentScore("张三", "语文", 81),
                new StudentScore("张三", "数学", 88),
                new StudentScore("张三", "英语", 90),
                new StudentScore("李四", "语文", 72),
                new StudentScore("李四", "数学", 97),
                new StudentScore("李四", "英语", 77),
                new StudentScore("王五", "语文", 95),
                new StudentScore("王五", "数学", 62),
                new StudentScore("王五", "英语", 92));
        if (Objects.isNull(student) || StringUtils.isEmpty(student.getName())) {
            return studentScores;
        }
        String name = student.getName();
        return studentScores.stream().filter(e -> name.equals(e.getName())).collect(Collectors.toList());
    }

    /**
     * 计算总分以及排名
     *
     * @param studentScoreList 学生成绩集合
     * @param studentScoreDto  学生成绩DTO
     */
    public static void calcSort(List<StudentScore> studentScoreList, StudentScoreDto studentScoreDto) {
        if (studentScoreList == null || studentScoreList.size() == 0) {
            return;
        }
        List<StudentScoreDto> tempList = new ArrayList<>();
        Map<String, List<StudentScore>> studentScoreMap = studentScoreList.stream().collect(Collectors.groupingBy(StudentScore::getName));
        for (List<StudentScore> value : studentScoreMap.values()) {
            if (value == null || value.size() == 0) continue;
            StudentScore studentScore = value.get(0);
            // 汇总学生总成绩,如果成绩不存在,则直接给0
            Integer sumScore = value.stream().map(StudentScore::getScore).reduce(Integer::sum).orElse(0);
            StudentScoreDto resultDto = new StudentScoreDto();
            resultDto.setName(studentScore.getName());
            resultDto.setScore(sumScore);
            tempList.add(resultDto);
        }
        AtomicInteger counter = new AtomicInteger(1);
        // 处理排名
        List<StudentScoreDto> resultList = tempList.stream().sorted(Comparator.comparing(StudentScoreDto::getScore).reversed()).collect(Collectors.toList());
        resultList.forEach(e -> e.setRank(counter.getAndIncrement()));
        studentScoreDto.setRankList(resultList);
    }

    /**
     * 查询学生成绩
     *
     * @param studentScoreList 学生成绩集合
     * @param studentScoreDto  学生成绩DTO
     */
    public static void findFirst(List<StudentScore> studentScoreList, StudentScoreDto studentScoreDto) {
        if (studentScoreList == null || studentScoreList.size() == 0) {
            return;
        }
        List<StudentScoreDto> rankList = studentScoreDto.getRankList();
        if (StringUtils.isEmpty(studentScoreDto.getName())) {
            // 学生名称为空,则输出第一名
            Optional<StudentScoreDto> first = rankList.stream().min(Comparator.comparing(StudentScoreDto::getRank));
            if (first.isPresent()) {
                StudentScoreDto studentScoreDto1 = first.get();
                System.out.println("第一名是:" + studentScoreDto1.getName() + ", 总分:" + studentScoreDto1.getScore());
            }
            return;
        }
        // 学生名称不为空,则输出学生排名
        Optional<StudentScoreDto> first = rankList.stream().filter(e -> studentScoreDto.getName().equals(e.getName())).findFirst();
        if (first.isPresent()) {
            StudentScoreDto studentScoreDto1 = first.get();
            System.out.println(studentScoreDto1.getName() + " 排名:" + studentScoreDto1.getRank() + ", 总分:" + studentScoreDto1.getScore());
        }
    }

感 谢 各 位 大 佬 的 阅 读,随 手 点 赞,日 薪 过 万~! !!

相关推荐
Nebula_g32 分钟前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__41 分钟前
python基础语法学习: 异常的传递性
开发语言·python·学习
AC赳赳老秦1 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
依然鸣1 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
小强库计算机毕业设计3 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
李冰然3 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java
库玛西3 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle3 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
人道领域4 小时前
【0-1的agent进阶篇】RAG:从Embedding到检索增强生成的底层逻辑
java·embedding·agent·rag
朋克洛德的码农4 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang