使用 lambda 表达式的写法

(1)提取对象集合中某个参数集合

已有某集合对象:

List<CmsUserRole> userRoles = xxx集合对象

传统方式:

List<Integer> roleIds = new ArrayList<>();
for (CmsUserRole userRole : userRoles) {
    roleIds.add(userRole.getRoleId());
}

lambda 表达式方式:map

List<Integer> roleIds = userRoles.stream().map(CmsUserRole::getRoleId).collect(Collectors.toList());

stream.map 里面如果要使用 { } 写多段代码,需要 return 才可以:

List<CustIssueTypeVo> list = beans.stream().map(c -> {
    CustIssueTypeVo l = new CustIssueTypeVo();
    l.setOrderNo(c.getOrderNo());
    l.setOtherNo(c.getOtherNo());
    return l;
}).collect(Collectors.toList());

(2)根据条件筛选过滤出来一个集合:filter

查询所有 level 不为空并且等于1的对象

//具体菜单列表
List<CmsMenu> cmsMenus = xxx 集合对象
//过滤出来所有一级菜单
List<CmsMenu> oneMenu = cmsMenus.stream()
        .filter(c -> c.getLevel() != null && c.getLevel() == DBStatusUtils.LevelGrade.one.getValue())
        .collect(Collectors.toList());

 (3)根据字段升降序:sorted

//具体菜单列表
List<CmsMenu> cmsMenus = xxx 集合对象
//过滤出来所有一级菜单
List<CmsMenu> oneMenu = cmsMenus.stream()
        .filter(c -> c.getLevel() != null && c.getLevel() == DBStatusUtils.LevelGrade.one.getValue())
        .sorted(Comparator.comparing(CmsMenu::getOrderNo))//升序
        //.sorted(Comparator.comparing(CmsMenu::getOrderNo).reversed())//降序
        .collect(Collectors.toList());

 (4)匹配字段:match【anyMatch 只要有一个匹配;allMatch 全部要匹配;noneMatch 全部不匹配】

boolean superAdminFlag = userRoles.stream().anyMatch(c -> c.getRoleId() == DBStatusUtils.RoleGrade.super_admin.getValue());

 (5)根据集合对象中某个字段去重

List<User> lists = 从某处得来的集合;
lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getXxx))), ArrayList::new));

如果想根据两个字段组合去重,则:

lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o->o.getXX1()+"_"+o.getXX2()))), ArrayList::new));

 (6)把一个集合分割成n个集合:

复制代码
/**
     * 把一个集合处理成10份10份的集合
     * @return
     */
    public static <T> List<List<T>> splitList(List<T> list, int splitSize) {
        //判断集合是否为空
        if (list == null || list.size() == 0) {
            return Collections.emptyList();
        }
        //计算分割后的大小
        int maxSize = (list.size() + splitSize - 1) / splitSize;
        //开始分割
        return Stream.iterate(0, n -> n + 1)
                .limit(maxSize)
                .parallel()
                .map(a -> list.parallelStream().skip(a * splitSize).limit(splitSize).collect(Collectors.toList()))
                .filter(b -> !b.isEmpty())
                .collect(Collectors.toList());
    }
复制代码

 (7)总计一个集合中的某个值,最终计算出来一个数据:【BigDecimal.ZERO 表示从0开始累计算起】

BigDecimal totalPrice = list.stream().map(c-> new BigDecimal(c.getPremium())).reduce(BigDecimal.ZERO, BigDecimal::add);

 (8)从一个集合中获取一条符合的数据

List<String> list = new ArrayList<>();
        list.add("a123");
        list.add("b456");
        list.add("c789");
        list.add("d123");
        String result = list.stream().filter(s -> "a123".equals(s)).findFirst().orElse(null);//符合条件的第一条返回,全都不符合返回 null
        System.out.println(result);

(9)集合中根据某一个字段分组:

List<TNbsLoldutyVo> gnbsPolicyInfos = policyMapper.getGnbsPolicyInfos(orderIds);
//根据 propNo 分组
Map<String, List<TNbsLoldutyVo>> groupedByPropNo = gnbsPolicyInfos.stream().collect(Collectors.groupingBy(TNbsLoldutyVo::getPropNo));

 

posted @   雪化山河  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示