Java8集合流操作

一、集合流操作:
多的不说直接贴(过滤、排序、聚合以及汇总demo)代码:

/**
 * Created by wangk on 2019-03-10.
 */
@Data
public class User {
    private int id;
    private String name;
    private String classNo;
    private int age;

    public User(int id, String name, String classNo, int age) {
        this.id = id;
        this.name = name;
        this.classNo = classNo;
        this.age = age;
    }
}

class StreamTest{
    public static void main(String[] args) {
        User user1 = new User(1, "张三", "no1", 27);
        User user2 = new User(2, "李四", "no2", 15);
        User user3 = new User(3, "王五", "no1", 24);
        User user4 = new User(4, "赵六", "no3", 15);
        User user5 = new User(5, "李七", "no1", 29);
        User user6 = new User(6, "钱八", "no3", 18);
        User user7 = new User(7, "孙九", "no1", 25);
        User user8 = new User(8, "周十", "no2", 19);
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        list.add(user5);
        list.add(user6);
        list.add(user7);
        list.add(user8);
        
       //List转map:把list里面的元素拿出来作为map的value,自己定义key
        //a->a, (k1,k2)->k1: 如果有重复的key就返回第一个
        Map<Integer, User> map1 = list.stream().collect(Collectors.toMap(User::getId, a->a, (k1,k2)->k1 ));
        System.out.println("map1");
        System.out.println(map1);

        //过滤Filter
        List<User> map2 = list.stream().filter(a -> a.getAge()>20).collect(Collectors.toList());
        System.out.println("map2");
        System.out.println(map2);

        //排序sort
        List<User> map3 = list.stream().sorted(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getAge()-o2.getAge();
            }
        }).collect(Collectors.toList());
        System.out.println("map3");
        System.out.println(map3);

        //求最大最小值
        Optional<User> user = list.stream().max(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                int n1 = Integer.parseInt(o1.getClassNo().substring(2, 3));
                int n2 = Integer.parseInt(o2.getClassNo().substring(2, 3));
                return n2-n1;
            }
        });
        System.out.println("user");
        System.out.println(user);

        //遍历修改数据
        list.stream().forEach(p -> {
            if ("张三".equals(p.getName())) {
                p.setClassNo("no3");
            }
        });
        System.out.println("list");
        System.out.println(list);


        //分组
        Map<String, List<User>> map6 =  list.stream().collect(Collectors.groupingBy(User::getClassNo));
        System.out.println("map6");
        System.out.println(map6);

      
        //groupingBy三个参数值是:1、分组字段 2、结合类型(默认是HashMap) 3、Coolections.toList()
        //因为HashMap是无序的,所以这里我们使用LinkHashMap
        //步骤:过滤 -> 排序 -> 分组
        LinkedHashMap<String, List<User>> map = list.stream().filter(a -> a.getAge()<29)
                .sorted(new Comparator<User>() {
                    @Override
                    public int compare(User o1, User o2) {
                        int n1 = Integer.parseInt(o1.getClassNo().substring(2, 3));
                        int n2 = Integer.parseInt(o2.getClassNo().substring(2, 3));
                        return n2-n1;
                    }
                })
                .collect(Collectors.groupingBy(
                        User::getClassNo,
                        LinkedHashMap::new,
                        Collectors.toList()));

        System.out.println("map");
        System.out.println(map);
    }
}

Stream常用方法:
在这里插入图片描述

Collectors 类的静态工厂方法:

工厂方法 返回类型 作用
toList List 把流中所有项目收集到一个 List
toSet Set 把流中所有项目收集到一个 Set,删除重复项
toCollection Collection 把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)
counting Long 计算流中元素的个数
sumInt Integer 对流中项目的一个整数属性求和
averagingInt Double 计算流中项目 Integer 属性的平均值
summarizingInt IntSummaryStatistics 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值
joining String 连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))
maxBy Optional 一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minBy Optional 一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing 归约操作产生的类型 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen 转换函数返回的类型 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingBy Map<K, List> 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningBy Map<Boolean,List> 根据对流中每个项目应用谓词的结果来对项目进行分区

猜你喜欢

转载自blog.csdn.net/weixin_40682142/article/details/88379427