java lamda 表达式(Java的Lambda表达式总结-JDK1.8)
导读: lambda是一个匿名函数 ( 里的表示参数...
lambda是一个匿名函数
()里的表示参数
{}里的表示方法体
-> 表示lambda运算符
常用的表达式如下:
一 、groupingBy用法
目的:数据库(想把相同的合并到一起)
代码示例:
//1.分页查询,通过重点任务主题 、重点事项 、重点负责人或任务的开始时间 、结束时间
List<ImportantTaskListDTO> importantTaskListDTOList = importantTaskMapper.getList(userId, taskDO, importantTaskSearchDTO);
//2.找每个重点任务对应的单个或多个负责人
//生成一个map ,键是按照groupingBy的分组编号 ,值是对应的分组list集合
Map<Long, List<ImportantTaskListDTO>> directorListMap = importantTaskListDTOList.stream().collect(Collectors.groupingBy(ImportantTaskListDTO::getTaskId));
二 、foreach用法
//生成一个map ,键是按照groupingBy的分组编号 ,值是对应的分组list集合
Map<Long, List<ImportantTaskListDTO>> directorListMap = importantTaskListDTOList.stream().collect(Collectors.groupingBy(ImportantTaskListDTO::getTaskId));
logger.info("directorListMap="+directorListMap);
importantTaskListDTOList.forEach(v1 -> {
Long taskId = v1.getTaskId();
List<ImportantTaskListDTO> directorList = directorListMap.get(taskId);
StringBuilder directorNamesBuilder = new StringBuilder();
directorList.forEach(v2 -> {
Long directorUserId = v2.getDirectorUserId();
String directorUserName = v2.getDirectorUserName();
directorNamesBuilder.append(directorUserName).append(",");
});
String directorNames = StringBuilderUtil.removeCharacterOfEndOfMessage(directorNamesBuilder);
//负责人名称们(逗号隔开)
v1.setDirectorNames(directorNames);
});
三 、相同list去重(list里面大部分一致 ,小部分不一致的 ,但是这小部分不返给前端)
// 原list去重 ,去掉完全一样的list行 ,通过taskId随机去重 ,利用的是treeSet的特性
importantTaskListDTOList = importantTaskListDTOList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(ImportantTaskListDTO::getTaskId))), ArrayList::new));
参考:https://blog.csdn.net/Oaklkm/article/details/127074712?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-127074712-blog-117334264.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-127074712-blog-117334264.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=6
四 、stream().map().collect(Collectors.toList())用法 ,把list对象里面的一个列生成对应的一个新list集合
List<AbnormalBuild> abnormalBuildList = this.list(new QueryWrapper<AbnormalBuild>().lambda().eq(AbnormalBuild::getStatus, Status.NORMAL.getCode()).eq(AbnormalBuild::getProjectId, SecurityUtils.getProjectId()));
List<String> resourceList = abnormalBuildList.stream().map(AbnormalBuild::getResourceId).collect(Collectors.toList());
LIST交集 ,差集 ,并集,
public class CollectionsTest {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");
List<String> list2 = new ArrayList<>();
list2.add("2");
list2.add("3");
list2.add("6");
list2.add("7");
// 交集
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
System.out.println("---交集 intersection---");
intersection.parallelStream().forEach(System.out::println);
// 差集 (list1 - list2)
List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
System.out.println("---差集 reduce1 (list1 - list2)---");
reduce1.parallelStream().forEach(System.out::println);
// 差集 (list2 - list1)
List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
System.out.println("---差集 reduce2 (list2 - list1)---");
reduce2.parallelStream().forEach(System.out::println);
// 并集
List<String> listAll = list1.parallelStream().collect(toList());
List<String> listAll2 = list2.parallelStream().collect(toList());
listAll.addAll(listAll2);
System.out.println("---并集 listAll---");
listAll.parallelStream().forEachOrdered(System.out::println);
// 去重并集
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
System.out.println("---得到去重并集 listAllDistinct---");
listAllDistinct.parallelStream().forEachOrdered(System.out::println);
}
}
五 、stream().map(v->{})这种方法可以 ,把list对象里面的多列生成对应的一个新list集合 ,常用来返回DTO里面包含了List<DTO>的封装
public CompanyDeptTreeDTO selectNewDeptList(String companyId){
//根据公司id查询公司
BCompany bCompany= remoteTreeService.infoById(companyId,SecurityConstants.INNER).getData();
CompanyDeptTreeDTO companyDeptTreeDTO = new CompanyDeptTreeDTO();
companyDeptTreeDTO.setResourceId(bCompany.getResourceId());
companyDeptTreeDTO.setLevel(bCompany.getLevel());
companyDeptTreeDTO.setName(bCompany.getName());
companyDeptTreeDTO.setShortName(bCompany.getShortName());
companyDeptTreeDTO.setNumber("");
//查询公司下部门集合
List<DepartmentsDTO> departmentsDTOSList = new ArrayList<>();
departmentsDTOSList = remoteTreeService.getNewChildren(companyId,SecurityConstants.INNER).getData()
.stream().distinct().map(v->{
DepartmentsDTO departmentsDTO = new DepartmentsDTO();//
departmentsDTO.setResourceId(v.getResourceId());
departmentsDTO.setName(v.getName());
departmentsDTO.setCode("");
departmentsDTO.setShortName("");
return departmentsDTO;
}).collect(Collectors.toList());
//组装并返回
companyDeptTreeDTO.setDepartmentsDTO(departmentsDTOSList);
return companyDeptTreeDTO;
}
六 、stream().map用法,同上 ,另外一个写法
//更新活动文件表 ,编辑一批图片 ,新图片就新增到数据库 ,存在则不管 ,删除的图片就新增更新人更新时间并改变status为0 ,其它都update
List<ActivityFile> activityFileList = this.list(new QueryWrapper<ActivityFile>().lambda().eq(ActivityFile::getStatus, Status.NORMAL.getCode()).eq(ActivityFile::getActivityId, resourceId));
//编辑图片:新增 、删除
List<String> preUrls = activityFileList.stream().map(v -> v.getFileUrl()).collect(Collectors.toList());
七 、stream().collect(Collectors.toMap)用法 ,生成一个map ,map键是XX名称 ,map值是这个名称对应的对象
// 查询出list
List<DbProcessMilepostNode> dbMileposts = milepostNodeService.selectAllByTenantId(TELANTID_OF_FIRST_BUILD_COMPANY, null);
// 遍历成map
Map<String, DbProcessMilepostNode> milepostMap = dbMileposts.stream().collect(Collectors.toMap(DbProcessMilepostNode::getMilepostName, obj -> obj));
八 、Function.identity()用法 ,一般和toMap对应使用
List<TaskListDetailDTO> important = importantTaskService.getImportantListByUserId(userId, taskStatus, keyword);
//处理登陆用户在同一个重点任务中既是负责人同时也是被抄送人或被预警人 ,只显示负责人那条能编辑的重点任务;如果只是被抄送人、被预警人则显示一条不能编辑的重点任务;下面的代码表示按照taskId去分组放到Map中 ,然后对比Map中的一组的多个TaskListDetailDTO的UserType的值,如果等于0则放回Map中 ,如果不等于0则返回
Map<Long, TaskListDetailDTO> collect = important.stream().collect(Collectors.toMap(TaskListDetailDTO::getTaskId, Function.identity(), (v1, v2) ->
Objects.equals(v1.getUserType(), 0) ? v1 : v2
));
Collection<TaskListDetailDTO> values = collect.values();
System.out.println(values);
九 、stream().sorted用法 ,对list里面的对象按照时间排序
List<DateDemo> list = new ArrayList<>();
DateDemo dateDemo = new DateDemo();
dateDemo.setId(1);
dateDemo.setDate(new Date());
list.add(dateDemo);
dateDemo = new DateDemo();
dateDemo.setId(2);
dateDemo.setDate(new Date());
list.add(dateDemo);
lambda排序:
// 时间升序
//List<DateDemo> listDemo = list.stream().sorted(Comparator.comparing(DateDemo::getDate)).collect(Collectors.toList());
// 时间降序
List<DateDemo> listDemo = list.stream().sorted(Comparator.comparing(DateDemo::getDate).reversed()).collect(Collectors.toList());
十 、stream().allMatch用法
taskStatusList = perTaskDetailInfo.stream().map(TaskDetailInfo::getTaskStatus).collect(Collectors.toList());
ifPreTaskComplete = Optional.ofNullable(taskStatusList.stream().allMatch(obj -> !obj.equals(2))).orElse(ifPreTaskComplete);
if(taskStatusList.size()!=0){//,如果完成 ,则更新为启动 ,如果未完成则继续下面的逻辑
for(int i=0;i<taskStatusList.size();i++){
if(!taskStatusList.get(i).equals(2)){
ifPreTaskComplete = false;
break;
}
}
}
以上代码都是本人在具体各个项目中用到的 ,然后总结出来 ,希望有所帮助
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!