Stream流
它可以让我们对集合的操作变得很简洁,省区甚多代码,它可以借助流式处理,在一行中完成功能
使用时注意三点: 数据源 数据处理 收集结果
在没有引入stream流之前,对集合元素筛选要写大量代码
List<User2> list = Arrays.asList(
new User2("小长",20,2000),
new User2("小红",21,3000),
new User2("小李",22,2000),
new User2("小王",19,3000)
);
// 筛选出 年龄小于20的人
List<User2> newList = new ArrayList<>();
for (User2 user : list) {
if ( user.getAge() <20 ) newList.add(user);
}
// 筛选出salary 大于2000 的人
List<User2> newList2 = new ArrayList<>();
for (User2 user : list) {
if ( user.getSalary() >=2000 ) newList2.add(user);
}
引入Stream,上面的问题可以简化为:
// 定义过滤条件
Predicate<User2> predicate1 = user2 -> user2.getAge() < 21;
Predicate<User2> predicate2 = user2 -> user2.getSalary() >= 2000;
// list.stream() 是数据源; .filter(上面定义的条件) 过滤的条件; .collect()指定过滤后新的集合
List<User2> collect = list.stream() // list.stream()是数据源
.filter(predicate1) // 过滤条件
.filter(predicate2)
.collect(Collectors.toList()); // 结果集
// 也可以这样写 且 .and 或 .or
List<User2> collect2 = list.stream()
.filter(predicate1.and(predicate2))
.collect(Collectors.toList());
配合Lambda表达式书写
什么是Lambda表达式?
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Lambda");
}
});
thread.start();
new Thread( ()->{
System.out.println("Lambda");
} ).start();
结合过后就可以这样书写
List<String> lList = Arrays.asList("hello","world","mysql","java");
lList.stream()
.filter( str -> str.length()>5 )
.forEach( str -> System.out.println(str) );
.limit 截取前n个结果
lList.stream()
.limit(2)
.forEach( str -> System.out.println(str) );
.sorted 默认升序 降序加参数用.sorted(Comparator.reverseOrder())
List<Integer> iList = Arrays.asList(1,3,5,2,6,9,4);
iList.stream()
.sorted()
.forEach( num -> System.out.println(num) );
.max .min .count 求最大,最小,长度
iList.stream().max(Integer::compareTo).get();
iList.stream().min(Integer::compareTo).get();
iList.stream().count();
.map 对集合中的元素进行操作
iList.stream()
.map(num->num+10)
.forEach(num-> System.out.println(num));
.collection 生成新的集合
List<Integer> collect1 = iList.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());
项目实战(进行list中字段的替换)
比如我们查出的List实体中有这么多字段 SysDept.class
/** 部门ID */
private Long deptId;
/** 父部门ID */
private Long parentId;
/** 祖级列表 */
private String ancestors;
/** 部门名称 */
private String deptName;
/** 显示顺序 */
private Integer orderNum;
/** 负责人 */
private String leader;
/** 联系电话 */
private String phone;
/** 邮箱 */
private String email;
/** 部门状态:0正常,1停用 */
private String status;
/** 删除标志(0代表存在 2代表删除) */
private String delFlag;
/** 父部门名称 */
private String parentName;
/** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>();
但是我们前端展示只需要这么多 TreeSelect.class
public class TreeSelect implements Serializable
{
private static final long serialVersionUID = 1L;
/** 节点ID */
private Long id;
/** 节点名称 */
private String label;
/** 子节点 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeSelect> children;
public TreeSelect()
{
}
public TreeSelect(SysDept dept)
{
this.id = dept.getDeptId();
this.label = dept.getDeptName();
this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public TreeSelect(SysMenu menu)
{
this.id = menu.getMenuId();
this.label = menu.getMenuName();
this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public List<TreeSelect> getChildren()
{
return children;
}
public void setChildren(List<TreeSelect> children)
{
this.children = children;
}
}
这个时候在service层查出来后就可以用stream流进行操作
/**
* 构建前端所需要下拉树结构
*
* @param depts 部门列表
* @return 下拉树结构列表
*/
@Override
public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
{
List<SysDept> deptTrees = buildDeptTree(depts);// 查出的部门列表
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());//这里是利用构造方法来进行值的替换的
}