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
诸葛