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
* ********************************
*
* 类描述:案例三
* 重点讲解:flatMap的使用方式
*
* @author zhangxiaoxi
* @date 下午9:50
*/
public class CaseThree {
/**
* 角色
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class Role {
/**
* 权限列表
*/
private List permissions;
}
/**
* 权限
*/
@Data
@AllArgsConstructor
class Permission {
/**
* 权限名称
*/
private String name;
}
/**
* 用户角色列表
*/
List roleList;
@Before
public void init() {
roleList = new ArrayList();
Role adminRole = new Role();
List adminPermissionList = Lists.newArrayList(
new Permission("删除"),
new Permission("查看"),
new Permission("导出"));
adminRole.setPermissions(adminPermissionList);
Role userRole = new Role();
List 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()
// TODO 扁平化MAP 获取对象中的集合类属性,组成一个新的流
// 注意flatMap和map方法的区别,flatMap是组成一个新的流,而map仅仅是映射成另外一个对象
// 此处如果是用的是map(role -> role.getPermission()),得到的是Stream>,
// 如果用的是map(role -> role.getPermisson().stream()),得到是Stream>>
// 如果用的是flatMap(role -> role.getPermission().stream()),得到的是Stream
.flatMap(role -> role.getPermissions().stream())
// peek 与 forEach 类似,区别是用在中间过程中,后面可以接其他操作
.peek(permission ->
System.out.println("新的流元素:" + permission))
.distinct()
// .forEach(permission -> System.out.println(permission));
.collect(Collectors.toList());
}
}