JDK8新特性Stream流

本文介绍了Java Stream流的使用,包括数据源、处理和收集结果的步骤,展示了如何通过Stream简化集合操作,如筛选、排序、计数等。同时,解释了Lambda表达式的概念,并给出了Lambda在Stream流中的应用示例,如字段替换和转换。最后,通过一个实战案例展示了如何在Service层使用Stream流构建前端所需的TreeSelect对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());//这里是利用构造方法来进行值的替换的
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值