使用 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));
分类:
lambda
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通