java中jdk8的Stream流的组合进阶用法

​ 我们知道jdk8的一大特色就是推出了Stream流编程,一段冗长的代码,抑或是相对较复杂的业务逻辑,Stream流让一行代码来完成变成了可能!

​ 下面通过一个例子来学习下Stream中的filter、collect等的组合用法,直接上代码吧,具体的请复制到自己的IDE中运行即可,代码书写很简单。

package cn.suvue.discipline.practice.stream;

import cn.hutool.json.JSONUtil;
import lombok.Builder;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 测试用的实体类
 *
 * @author suvue
 * @date 2020/1/8
 */
@Data
@Builder
class Org {
    //主键id
    private Long id;

    //父部门id
    private Long pid;

    //父级ids
    private String pids;

    //名称
    private String name;

    //组织类型(1:公司 2:部门)
    private Integer orgType;
}

/**
 * stream流的map用法
 *
 * @author suvue
 * @date 2020/1/8
 */
public class StreamMapOperation {
    //组织架构的集合
    private static List<Org> orgList = new ArrayList<>();

    static {
        /**
         * 类加载时初始化一些数据
         */
        Org comp1 = Org.builder().id(1L).name("一公司").pid(0L).pids("0L").orgType(1).build();
        Org dept1 = Org.builder().id(2L).name("一公司的一部门").pid(1L).pids("0,1").orgType(2).build();
        Org dept2 = Org.builder().id(3L).name("一公司的二部门").pid(1L).pids("0,1").orgType(2).build();
        Org dept3 = Org.builder().id(4L).name("一公司的三部门").pid(1L).pids("0,1").orgType(2).build();
        Org comp2 = Org.builder().id(5L).name("二公司").pid(0L).pids("0L").orgType(1).build();
        Org dept4 = Org.builder().id(6L).name("二公司的一部门").pid(5L).pids("0,5").orgType(2).build();
        Org dept5 = Org.builder().id(7L).name("二公司的二部门").pid(5L).pids("0,5").orgType(2).build();
        Org dept6 = Org.builder().id(8L).name("二公司的三部门").pid(5L).pids("0,5").orgType(2).build();
        orgList.add(comp1);
        orgList.add(dept1);
        orgList.add(dept2);
        orgList.add(dept3);
        orgList.add(comp2);
        orgList.add(dept4);
        orgList.add(dept5);
        orgList.add(dept6);
    }

    public static void main(String[] args) {

        /**
         * 这里我们以获取公司下的部门的例子,它们用的时一样的实体类,是通过orgType实体来区分
         * 以下代码中的Function部分可以通过IDE(如IDEA等)的提示进行代码优化,可以更精简一些
         */
        Map<String, Map<String, Long>> mapMap = orgList.stream()
                .filter(c -> c.getOrgType() == 1)
                .collect(Collectors.toMap(
                        Org::getName,
                        c -> orgList.stream()
                                .filter(d -> d.getOrgType() == 2 && d.getPids().contains(String.valueOf(c.getId())))
                                .collect(Collectors.toMap(
                                        new Function<Org, String>() {
                                            @Override
                                            public String apply(Org o) {
                                                return o.getName();
                                            }
                                        },
                                        new Function<Org, Long>() {
                                            @Override
                                            public Long apply(Org org) {
                                                return org.getId();
                                            }
                                        }
                                ))

                ));

        System.out.println(JSONUtil.toJsonStr(mapMap));
        
    }

}

输出结果请看下方

{
    "一公司": {
        "一公司的二部门": 3,
        "一公司的一部门": 2,
        "一公司的三部门": 4
    },
    "二公司": {
        "二公司的三部门": 8,
        "二公司的二部门": 7,
        "二公司的一部门": 6
    }
}

有精通的朋友还请指出不足,在下感激不尽!

发布了39 篇原创文章 · 获赞 13 · 访问量 2293

猜你喜欢

转载自blog.csdn.net/weixin_45612794/article/details/103898927