Java8 Stream 统计 排序 List Map 相互转换

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

强烈推荐先看这篇 Java8 Stream(1)详细总结目录

package com.pigg.study.tree.common.stream;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.*;

public class JavaStreamTest {

    private static List<Pig> pigs = new ArrayList<>();

    public static void main(String[] args) {

        pigs.add(new Pig(1, "猪爸爸", 31, "M", false));
        pigs.add(new Pig(2, "猪妈妈", 28, "F", true));
        pigs.add(new Pig(3, "乔治", 2, "M", false));
        pigs.add(new Pig(4, "佩奇", 5, "F", false));

        //region filter,过滤
        System.out.println("===a -> a.getAge() > 5===");
        pigs.stream().filter(a -> a.getAge() > 5).forEach(System.out::println);

        System.out.println("===Pig::isValid===");
        pigs.stream().filter(Pig::isValid).forEach(System.out::println);
        //endregion

        //region match,是否匹配,返回Boolean
        System.out.println("===anyMatch(a -> a.getAge() > 50)===");
        Boolean anyOldThan50 = pigs.stream().anyMatch(a -> a.getAge() > 50);
        System.out.println(anyOldThan50);

        System.out.println("===noneMatch(a -> a.getAge() > 50)===");
        Boolean noneMatchOldThan50 = pigs.stream().noneMatch(a -> a.getAge() > 50);
        System.out.println(noneMatchOldThan50);

        System.out.println("===allMatch(a -> a.getAge() < 50)===");
        Boolean allLittleThan50 = pigs.stream().allMatch(a -> a.getAge() < 50);
        System.out.println(allLittleThan50);
        //endregion

        //region find,查找数据,返回Optional<T>
        System.out.println("===pigs.stream().findFirst()===");
        Optional<Pig> pigOptional = pigs.stream().findFirst();
        if (pigOptional.isPresent()){
            System.out.println(pigOptional.get().getName());
        }

        System.out.println("===filter(a -> a.getAge() < 30).findFirst()===");
        Optional<Pig> pigOptional2 = pigs.stream().filter(a -> a.getAge() < 30).findFirst();
        if (pigOptional2.isPresent()){
            System.out.println(pigOptional2.get().getName());
        }
        //endregion

        //region sort排序
        System.out.println("comparing(Pig::getAge)");
        pigs.sort(comparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("comparing(Pig::getAge).reversed()");
        pigs.sort(comparing(Pig::getAge).reversed());
        pigs.forEach(System.out::println);

        System.out.println("根据性别gender升序排,再以年龄age升序");
        pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("根据性别gender升序排,再以年龄age降序");
        pigs.sort(comparing(Pig::getGender).thenComparing(comparing(Pig::getAge).reversed()));
        pigs.forEach(System.out::println);

        System.out.println("根据性别gender降序排,再以年龄age升序");
        pigs.sort(comparing(Pig::getGender).reversed().thenComparing(Pig::getAge));
        pigs.forEach(System.out::println);

        System.out.println("根据性别gender降序排,再以年龄age降序");
        pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge).reversed());
        pigs.forEach(System.out::println);
        //endregion

        //region List<T>的map处理

        //获取对象里某个值的集合
        System.out.println("===map(Pig::getGender).collect(toList())===");
        List<String> genders = pigs.stream().map(Pig::getGender).collect(toList());
        genders.forEach(System.out::println);

        //配合distinct去重
        System.out.println("====map(Pig::getGender).distinct().collect(toList())===");
        List<String> disGenders = pigs.stream().map(Pig::getGender).distinct().collect(toList());
        disGenders.forEach(System.out::println);

        //配合toSet去重
        System.out.println("====map(Pig::getGender).distinct().collect(toSet())===");
        Set<String> disGenders2 = pigs.stream().map(Pig::getGender).collect(toSet());
        disGenders2.forEach(System.out::println);

        //joining拼接字符串
        System.out.println("===map(Pig::getName).collect(joining(\",\"))===");
        String names = pigs.stream().map(Pig::getName).collect(joining(","));
        System.out.println(names);

        //List转Map<String, Object>
        System.out.println("===List转Map<String, Object>, 如果key一样,取第一个=== ");
        Map<String, Pig> mapByName = pigs.stream().collect(Collectors.toMap(Pig::getName, a->a, (k1, k2) -> k1));
        mapByName.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });

        //List<T>转Map<String, List<T>>
        System.out.println("===List<T>转Map<String, List<T>>===");
        Map<String, List<Pig>> groupByGender = pigs.stream().collect(groupingBy(Pig::getGender));
        groupByGender.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });

        System.out.println("===groupingBy + counting 统计各个性别的人数===");
        Map<String, Long> genderCount = pigs.stream().collect(
                Collectors.groupingBy(Pig::getGender, Collectors.counting())
        );
        genderCount.forEach((k, v) -> System.out.println(k + " -> 人数=" + v));

        //分区,partitioningBy,键是Boolean类型
        System.out.println("===.collect(partitioningBy(Pig::isValid))===");
        Map<Boolean, List<Pig>> partitioningByValid =pigs.stream().collect(partitioningBy(Pig::isValid));
        partitioningByValid.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });
        //endregion

        //region  List<Map<String, Object>>的map处理

        List<Map<String, Object>> pigMapList = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("id", "1");
        map1.put("name", "猪爸爸");
        map1.put("age" , 31);
        map1.put("gender" , "M");

        Map<String, Object> map2 = new HashMap<>();
        map2.put("id", "2");
        map2.put("name", "猪妈妈");
        map2.put("age" , 28);
        map2.put("gender" , "F");

        Map<String, Object> map3 = new HashMap<>();
        map3.put("id", "3");
        map3.put("name", "乔治");
        map3.put("age" , 2);
        map3.put("gender" , "M");

        pigMapList.add(map1);
        pigMapList.add(map2);
        pigMapList.add(map3);

        System.out.println("List<Map<String, Object>>的map处理--》获取List<String>");
        List<String> pigIds = pigMapList.stream().map(a -> a.get("id").toString()).collect(Collectors.toList());
        pigIds.forEach(System.out::println);

        System.out.println("List<Map<String, Object>>的map处理--》获取namesOfMap");
        String namesOfMap = pigMapList.stream().map(a -> a.get("name").toString()).collect(joining(","));
        System.out.println(namesOfMap);

        System.out.println("List<Map<String, Object>>的map处理--》根据Id分组,转Map<String, List<Map<String, Object>>>");
        Map<String, List<Map<String, Object>>> groupByGenderMap = pigMapList.stream().collect(groupingBy(e -> e.get("gender").toString()));
        groupByGenderMap.forEach((k, v) -> {
            System.out.println(k + " -> " + v.toString());
        });
        //endregion

        //region 统计

        //count,统计个数
        long count = pigs.stream().filter(a -> a.getAge() > 5).count();
        System.out.println("age > 5的人数 = " + count);

        //limit,取前几个
        System.out.println("top2");
        Stream<Pig> top2Pigs = pigs.stream().sorted(comparing(Pig::getAge)).limit(2);
        top2Pigs.forEach(System.out::println);

        int sumAge = pigs.stream().mapToInt(Pig::getAge).sum();
        int maxAge = pigs.stream().mapToInt(Pig::getAge).max().getAsInt();
        int minAge = pigs.stream().mapToInt(Pig::getAge).min().getAsInt();
        double avgAge = pigs.stream().mapToInt(Pig::getAge).average().getAsDouble();

        System.out.println("sumAge = " + sumAge);
        System.out.println("maxAge = " + maxAge);
        System.out.println("minAge = " + minAge);
        System.out.println("avgAge = " + avgAge);

        Optional<Pig> pigMaxAgeOptional = pigs.stream().collect(Collectors.maxBy(comparing(Pig::getAge)));
        if (pigMaxAgeOptional.isPresent()){
            System.out.println("maxAge = " + pigMaxAgeOptional.get().getAge());
        }
        //endregion
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Pig {
    private int id;
    private String name;
    private Integer age;
    private String gender;
    private boolean valid;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

瑟 王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值