java stream 分组操作

ArrayList<Student> list = Lists.newArrayList(
        Student.builder().no("1001").name("小A").score(11d).build(),
        Student.builder().no("1001").name("小B").score(12d).build(),
        Student.builder().no("1002").name("小C").score(13d).build(),
        Student.builder().no("1003").name("小D").score(14d).build(),
        Student.builder().no("1003").name("小F").score(14d).build()
);
//正常分组
Map<String, List<Student>> map = list.stream().collect(Collectors.groupingBy(Student::getNo));
System.out.println(JSONObject.toJSONString(map));
//分组定制key
Map<String, List<Student>> map1 = list.stream().collect(Collectors.groupingBy(
       obj -> obj.getNo()+"_"+obj.getName()
));
System.out.println(JSONObject.toJSONString(map1));
//根据条件分组
Map<String, List<Student>> map2 = list.stream().collect(Collectors.groupingBy(
        obj -> {
         if (obj.getScore() >=13){
             return "高等级";
         }else {
             return "低等级";
         }
        }
));
System.out.println(JSONObject.toJSONString(map2));

//根据条件分组 嵌套分组
Map<String, Map<String,List<Student>>> map3 = list.stream().collect(Collectors.groupingBy(Student::getNo,Collectors.groupingBy(
        obj -> {
            if (obj.getScore() >=13){
                return "高等级";
            }else {
                return "低等级";
            }
        }
)));
System.out.println(JSONObject.toJSONString(map3));

//根据条件分组 取某个字段
Map<String, String> map4 = list.stream().collect(Collectors.groupingBy(Student::getNo,
        Collectors.mapping(Student::getName,Collectors.joining(",","名称为:[","]"))
        ));
System.out.println(JSONObject.toJSONString(map4));
//分组之后进行数据转化
Map<String, Student> map5 = list.stream().collect(Collectors.groupingBy(Student::getNo,
        Collectors.collectingAndThen(
                Collectors.reducing((c1,c2) -> c1.getScore() > c2.getScore() ? c1:c2), Optional::get
        )
));
System.out.println(JSONObject.toJSONString(map5));
//分组完成求平均值
Map<String, Double> map6 = list.stream().collect(Collectors.groupingBy(Student::getNo,
        Collectors.averagingDouble(Student::getScore)
));
System.out.println(JSONObject.toJSONString(map6));
//分组完成相加成绩作为value
Map<String, Double> map7 = list.stream().collect(Collectors.groupingBy(Student::getNo,
        Collectors.summingDouble(Student::getScore)
));
System.out.println(JSONObject.toJSONString(map7));
//分组 根据value进行倒叙
LinkedHashMap<String, Double> map8 = new LinkedHashMap<>();
map7.entrySet().stream().sorted(Map.Entry.<String,Double>comparingByValue()
        .reversed()).forEachOrdered(e ->map8.put(e.getKey(),e.getValue()));
System.out.println(map8);
//分组 value是分完组之后的size
Map<String, Long> map9 = list.stream().collect(Collectors.groupingBy(Student::getNo,
        Collectors.mapping(Function.identity(), Collectors.counting())
));
System.out.println(map9);
//分组 根据可以排序
HashMap<String, Double> map10= list.stream().collect(Collectors.groupingBy(Student::getNo,
        HashMap::new,
        Collectors.summingDouble(Student::getScore)
));
System.out.println(map10);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java Stream提供了一种方便的方式来对数据进行分组操作。通过使用Stream的groupingBy方法,我们可以根据指定的条件将数据分组一个Map对象,其中键是分组条件,值是对应的数据列表。 下面是Java Stream分组数据的示例代码: ```java import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 假设有一个包含Person对象的列表 List<Person> persons = Arrays.asList( new Person("Alice", 20), new Person("Bob", 25), new Person("Charlie", 30), new Person("Alice", 35) ); // 根据姓名进行分组 Map<String, List<Person>> groupedByName = persons.stream() .collect(Collectors.groupingBy(Person::getName)); // 输出分组结果 for (String name : groupedByName.keySet()) { System.out.println("Name: " + name); System.out.println("Persons: " + groupedByName.get(name)); System.out.println(); } } static class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } } ``` 上述代码中,我们定义了一个Person类,包含姓名和年龄两个属性。然后创建了一个包含Person对象的列表。通过使用Stream的groupingBy方法,我们根据姓名对Person对象进行分组,得到一个Map对象。最后,我们遍历Map对象,输出分组结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值