1    重点:

1.1  扁平化demo

1.2  当使用对象的distinct方法时:需要重写equals和hashcode方法(用lombok的标签@Data@AllArgsConstructor不需要重写方法):

1.3  扁平化同样使用于集合,不单单用于拆字

 

 

 

 

2    扁平化demo

查找demo需求:

用户下有角色,角色下有按钮,求拥有不同角色的用户下的按钮的去重合集

 

 

 

测试类:

package com.imooc.zhangxiaoxi.stream.cases;

import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 类名称:CaseThree
 * ********************************
 * <p>
 * 类描述:案例三
 * 重点讲解:flatMap的使用方式
 *
 * @author zhangxiaoxi
 * @date 下午9:50
 */
public class CaseThree {



    /**
     * 角色
     */
    /*@Data
    @AllArgsConstructor
    @NoArgsConstructor*/
    class Role {
        /**
         * 权限列表
         */
        private List<Permission> permissions;

        public List<Permission> getPermissions() {
            return permissions;
        }

        public void setPermissions(List<Permission> permissions) {
            this.permissions = permissions;
        }
    }
    /**
     * 权限
     */
    /*@Data
    @AllArgsConstructor*/
    class Permission {
        /**
         * 权限名称
         */
        private String name;

        public Permission(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Permission{" +
                    "name='" + name + '\'' +
                    '}';
        }


        //重写equals要实现hachCode()
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        //第三步
        @Override
        public boolean equals(Object obj) {
            if (this == obj)   //判断对象地址是否相等,如果是就不用判断,提高效率
                return true;
            if (obj == null)   //对象为空,则不往下走了
                return false;
            if (getClass() != obj.getClass())  //判断两个对象是否一样:
                return false;
            CaseThree.Permission tag = (CaseThree.Permission) obj;  //向下转型
            //String类型,equals()比较
            if (name == null) {
                if (tag.name != null)
                    return false;
            } else if (!name.equals(tag.name))
                return false;
            return true;
        }
    }

    /**
     * 用户角色列表
     */
    List<Role> roleList;

    @Before
    public void init() {
        roleList = new ArrayList();

        Role adminRole = new Role();
        List<Permission> adminPermissionList = Lists.newArrayList(
                new Permission("删除"),
                new Permission("查看"),
                new Permission("导出"));
        adminRole.setPermissions(adminPermissionList);

        Role userRole = new Role();
        List<Permission> userPermissionList = Lists.newArrayList(
                new Permission("新建"),
                new Permission("修改"),
                new Permission("删除"),
                new Permission("查看"));
        userRole.setPermissions(userPermissionList);

        roleList.add(adminRole);
        roleList.add(userRole);
    }

    @Test
    public void findPermission() {
    //注掉的是我写错的,用来和正确的对比
/*roleList.stream().flatMap(role -> { return role.getPermissions().stream().distinct(); }).forEach(permission->System.out.println(permission.name));*/ roleList.stream(). flatMap(role -> role.getPermissions().stream()). distinct(). forEach(permission->System.out.println(permission)); } }

 

 

 

 

 

打印日志:

Permission{name='删除'}
Permission{name='查看'}
Permission{name='导出'}
Permission{name='新建'}
Permission{name='修改'}

Process finished with exit code 0

 

posted on 2020-05-14 06:12  菜鸟乙  阅读(237)  评论(0编辑  收藏  举报