Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)

这篇具有很好参考价值的文章主要介绍了Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java Stream 处理分组后取每组最大

有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个

Map<String, HitRuleConfig> configMap = configList.parallelStream().collect(
               Collectors.groupingBy(HitRuleConfig::getAppId, // 先根据appId分组
               Collectors.collectingAndThen(
               Collectors.reducing(( c1,  c2) -> c1.getVersionSort() > c2.getVersionSort() ? c1 : c2), Optional::get)));

先根据appId分组,然后根据versionSort取最大.

【编程技巧】Stream流之list转map、分组取每组第一条

前言

JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。

一、list转map

取list中对象的某个属性作为唯一key,对象作为value形成一个map集合,能够便于在后续业务中取值而不用遍历list集合,使代码更优雅。

代码如下(示例):

public class StreamSkill {

    public static void main(String[] args) {
        List<TestData> list = new ArrayList<>();
        TestData.TestDataBuilder builder = TestData.builder();
        builder.id(1).name("老王").age(50).address("隔壁");
        list.add(builder.build());
        builder.id(2).name("司马老贼").age(45).address("许昌");
        list.add(builder.build());

        System.out.println(list);

        Map<Integer, TestData> map = list.stream().collect(Collectors.toMap(TestData::getId, Function.identity()));

        System.out.println(map.get(1));

    }

}

@Data
@Builder
class TestData{
    private Integer id;
    private String name;
    private Integer age;
    private String address;
}

运行结果:
stream 分组取最新,Java8新特性,Java,Stream,Collectors,reducing,新特性

二、分组取每组第一条数据

通过分组取每组第一条数据的操作可以在很多场景适用,比如取多条数据中最新的一条数据等场景。

代码如下(示例):

public class StreamSkill {

    public static void main(String[] args) {
        List<TestData> list = new ArrayList<>();
        TestData.TestDataBuilder builder = TestData.builder();
        builder.id(1).name("老王").age(50).address("隔壁");
        list.add(builder.build());
        builder.id(2).name("司马老贼").age(45).address("许昌");
        list.add(builder.build());
        builder.id(3).name("曹贼").age(43).address("许昌");
        list.add(builder.build());
        builder.id(4).name("大耳朵").age(52).address("益州");
        list.add(builder.build());
        builder.id(5).name("燕人").age(58).address("益州");
        list.add(builder.build());

        System.out.println(list);

        Map<String, TestData> map = list.stream().collect(
                Collectors.groupingBy(TestData::getAddress, Collectors.collectingAndThen(
                        Collectors.reducing((t1, t2) -> t1.getAge() > t2.getAge() ? t1 : t2),
                        Optional::get
                ))
        );

        System.out.println(map);
    }
}


@Data
@Builder
class TestData{
    private Integer id;
    private String name;
    private Integer age;
    private String address;
}

运行结果:
stream 分组取最新,Java8新特性,Java,Stream,Collectors,reducing,新特性
从运行结果可以看出,根据address分组后取每组年龄最大的对象信息仅需要
小小的几行代码就可以搞定

总结

实际业务中根据业务合理利用stream流能够很大程度的简化代码,但是这种写法在出现bug的时候排查较为复杂,建议不要在使用stream流的时候在其中写太复杂的逻辑。

Java 8 Collectors:reducing 示例(List分组取最值)

简介

Java 8 Collectors.reducing 利用Comparator(比较器)BinaryOperator(二元运算符)进行减少流中的元素。
Collectors.reducing返回带有Optional数据的Collector(收集器)

Collectors.reducingJava Doc 的方法语法如下。

public static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op) 

Collectors.reducing返回一个Optional类的收集器。

我们需要传递BinaryOperator(二元运算符)BinaryOperator.maxByBinaryOperator.minBy方法。

BinaryOperator(二元运算符)Comparator(比较器)作为参数。

根据该Comparator(比较器)BinaryOperator(二元运算符),流元素被减少,最后可以作为一个组来收集。

使用场景

Collectors.reducing 主要用于取List列表中的某一类型中的最大或最小的一个元素,例如下列代码,取出各个班级中年龄最大的学生信息。

注:如果最值相同,取列表顺序最先出现的一个。

代码示例

Student.java

package com.concretepage.util;
public class Student {
    private String name;
    private Integer age;
    private String className;
    public Student(String name,Integer age, String className){
        this.name=name;
        this.age=age;
        this.className = className;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }
    public String getClassName() {
        return className;
    }
}  

ReducingDemo.java

package com.concretepage.util;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
public class ReducingDemo {
    public static void main(String[] args) {
        Student s1 = new Student("Shyam", 22,"A");
        Student s2 = new Student("Ram",23,"A");
        Student s3 = new Student("Mohan",22,"B");
        Student s4 = new Student(null,21,"B");
        List<Student> list = Arrays.asList(s1,s2,s3,s4);
        Comparator<Student> ageComparator = Comparator.comparing(Student::getAge); 
        Map<String, Optional<Student>> eldestByClass = list.stream().collect(Collectors.groupingBy(Student::getClassName, 
                Collectors.reducing(BinaryOperator.maxBy(ageComparator))));
        eldestByClass.forEach((k,v)->System.out.println("Class:"+k+" Age:"+
                ((Optional<Student>)v).get().getAge()+" Name:"+((Optional<Student>)v).get().getName()));
    }
} 

输出文章来源地址https://www.toymoban.com/news/detail-577464.html

Class:A Age:23 Name:Ram
Class:B Age:22 Name:Mohan 

到了这里,关于Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计

    Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等 汇总统计方法 找到汇总统计的方法。这些方法属于java 8的汇总统计类。 getAverage(): 它返回所有接受值的平均值。 getCount():

    2023年04月20日
    浏览(63)
  • SQL分组后取topN

    求每门课程中成绩最好的人 使用窗口函数: 利用表链接 使用子查询 求每门课程成绩前两人 使用窗口函数: 使用自身左链接 结果: 这是对CID分组,按分数排名的表 上图中3中不同的排名方式,对应sql窗口函数的三种 row_number : 就是按1-2-3顺序排 rank:就是按 1-1-3 排列--这就是 

    2024年02月10日
    浏览(36)
  • ElasticSearch 分组统计,每组取最新数据

    ElasticSearch按任务id分组统计 查询方法: 任务ID一个,网站ID若干 求: 按网站ID分组,crawTotal最大,且时间为最新的一条数据。

    2024年02月10日
    浏览(46)
  • Java stream 分组操作

    根据单/多字段分组 单字段分组可以直接使用指定字段,多字段分组则采用拼接Key的形式 单字段: 多字段: 多层级: 测试

    2024年02月15日
    浏览(37)
  • 【ES】分组后每组取第一条

    表格如下: 想要获得所有测站最新的一条数据,即先对Station分组,根据time进行排序(降序),取第一条。 参考文章: 分组后进行排序取第一条,然后再过滤 - Elastic 中文社区

    2024年02月15日
    浏览(75)
  • java stream实现分组BigDecimal求和,自定义分组求和

    随着微服务的发展,越来越多的sql处理被放到java来处理,数据库经常会使用到对集合中的数据进行分组求和,分组运算等等。 那怎么样使用java的stream优雅的进行分组求和或运算呢? 这里测试数据学生,年龄类型是Integer,身高类型是BigDecimal,我们分别对身高个年龄进行求和

    2024年02月01日
    浏览(44)
  • Java stream多字段分组(groupingBy)

    近期的项目里,遇到一个需求:对于含有多个元素的 ListPerson ,按照其中的某几个属性进行分组,比如 Persion::getAge 、 Persion::getType 、 Persion::getGender 等字段。下面就让我们讨论一下如何比较优雅的按多字段进行分组groupingBy。 Stream 是Java8的一个新特性,主要用户集合数据的处

    2024年02月13日
    浏览(41)
  • Java Stream流 Map 分组方式汇总

    java老式的分组方式(对list for循环然后 if判断 放入map) 代码复杂,易读性差,维护性差,故本文汇总了Stream流中的分组方法供大家参考,如对您有帮助,请抬抬高贵的小手点个赞吧,欢迎大佬留下高见 (以下方法默认都是java8的方法,java9新增方法有标注) 按颜色分组 打印Map结果: {红色

    2024年02月06日
    浏览(41)
  • Java中用Stream分组并求各组数量

    比如给了我一个班级的所有人的姓氏和姓名对象集合,根据这个集合求出各姓氏有多少人。直接上代码。 User的实体类对象为 输出的结果为:   即姓张的有3个,姓李的有两个。 详解: 将该集合的stream流用Collectors对象转成Map,用User对象的firstName作为Key,默认键值为1,在处

    2024年02月12日
    浏览(41)
  • Java Stream 实用特性:排序、分组和 teeing

    基本数据类型排序 基本数据类型就是字符串、整型、浮点型这些,也就是要排序的列表中的元素都是这些基本类型的,比如 ListInteger 的。 下面就用一个整型列表举例说明。 正序排序 正序排序,也可以叫做按照自然顺序排序,对于整型来说就是从小到大的。 输出结果是 [0

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包