java8 stream 的list处理
目录
- 1、List<Map>使用map中每一个字符拼接字符串
- 2、取出list集合对象中某一个属性,生成新的list
- 3、list集合的排序
- ①List(Bean)
- ②List (Map):方式①
- ③List (Map):方式2
- 4、list集合分组
- ①Collectors.groupingBy
- ②Maps.uniqueIndex
- 5、List中Map 根据key去重
- 6、list的filter过滤
- ① java8的方式
- ②java版本低于8的方式
- 7、java8 stream做统计(分组后取最大最小,排序)
- 8、先用groupingBy分组,再使用joining将某个字段进行拼接
- 9、java8 两个List集合取交集、并集、差集
1、List<Map>使用map中每一个字符拼接字符串
参考来源
List> list = new ArrayList<>();Map m = new HashMap();m.put("name", "樟树街");Map m1 = new HashMap();m1.put("name", "樟树街1");Map m2 = new HashMap();m2.put("name", "樟树街1");list.add(m);list.add(m2);list.add(m1);String s= list.stream().map(p->p.get("name")).collect(Collectors.joining(","));
List<SysInfoItem> sysInfoItems = sysFeignClient.getInfoItemsBySetId('');
// 【启用】状态的字段名称,以读好分隔
String items = sysInfoItems.stream().map(sysInfoItem -> sysInfoItem.getItemId()).collect(Collectors.joining(","));
2、取出list集合对象中某一个属性,生成新的list
参考来源
List<TrnRequirement> list = this.list();
List<String> requirementIdList = list.stream().map(TrnRequirement::getId).distinct().collect(Collectors.toList());
3、list集合的排序
①List(Bean)
//排序 项目状态(已结束的在最后面),累计项目效能,部门,项目经理resultList = resultList.stream().sorted(Comparator.comparing(StatisticsProjectEfficacyVO::getProjectStatus).thenComparing(StatisticsProjectEfficacyVO::getEfficacyTotal).thenComparing(StatisticsProjectEfficacyVO::getDeptId).thenComparing(StatisticsProjectEfficacyVO::getProjectManageName)).collect(Collectors.toList());
@Data
@AllArgsConstructor
public class Person {Integer id;Integer age;Integer type;public static void main(String[] args) {List<Person> persons = new ArrayList<>();persons.add(new Person(7, 10, 1));persons.add(new Person(2, 10, 1));persons.add(new Person(5, 10, 1));persons.add(new Person(3, 26, 2));persons.add(new Person(4, 35, 2));persons.add(new Person(6, 23, 2));persons.add(new Person(10, 23, 3));persons.add(new Person(11, 24, 3));persons.add(new Person(11, 23, 3));persons = persons.stream().sorted(Comparator.comparing(Person::getType).reversed().thenComparing(Person::getId).thenComparing(Comparator.comparing(Person::getAge).reversed())).collect(Collectors.toList());System.out.println(JSON.toJSONString(persons));}}
上面的代码,先对 type 降序, 再对 id 升序,最后对 age 降序
②List (Map):方式①
参考地址
public class Test {public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>();map.put("name", "ZK");map.put("age", 13);Map<String, Object> map2 = new HashMap<String, Object>();map2.put("name", "ZA");map2.put("age", 15);Map<String, Object> map3 = new HashMap<String, Object>();map3.put("name", "CX");map3.put("age", 20);Map<String, Object> map4 = new HashMap<String, Object>();map4.put("name", "CX");map4.put("age", 18);List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();list.add(map);list.add(map2);list.add(map3);list.add(map4);// 排序代码如下List<Map<String, Object>> collect = list.stream().sorted(Comparator.comparing(Test::comparingByName).thenComparing(Comparator.comparing(Test::comparingByAge).reversed())).collect(Collectors.toList());}private static String comparingByName(Map<String, Object> map){return (String) map.get("name");}private static Integer comparingByAge(Map<String, Object> map){return (Integer) map.get("age");}
③List (Map):方式2
list.sort()集合排序之null值处理
public static void main(String[] args) {testListMapSort();}public static void testListMapSort() {List<Map> list = new ArrayList<>();Map map1 = new HashMap<>();map1.put("aaa", "2021-10-12");list.add(map1);Map map2 = new HashMap<>();map2.put("aaa", "2022-08-10");list.add(map2);Map map3 = new HashMap<>();map3.put("aaa", "2021-08-19");list.add(map3);System.out.println(JSON.toJSON(list));list.sort(Comparator.comparing(map -> (String) map.get("aaa")));System.out.println(JSON.toJSON(list));}}
4、list集合分组
①Collectors.groupingBy
注意:key不能为空
Map<String, List<SiFundBaseManage>> baseManageMap =
baseManageList.stream().collect(
Collectors.groupingBy(SiFundBaseManage::getPersonId)
);
②Maps.uniqueIndex
//若name对应了多条记录,会报错
Map<String, Fruit> map = Maps.uniqueIndex(
fruitList, Fruit::getName);
5、List中Map 根据key去重
参考地址
public List<Map<String, String>> getAttrActions(String ns, String category, String ci) {String sql = "SELECT ID AS value,NAME AS label FROM IES.CMDB_META_ACTION " +"WHERE NS = '" + ns + "' AND CATEGORY = '" + category + "' AND CI = '" + ci + "'";List<Map<String, Object>> mapList = runner.executeSQL(sql);List<Map<String, Object>> attrActionsList = new ArrayList<>();DMMetaEnum.MetaAttrActions[] attrActions = DMMetaEnum.MetaAttrActions.values();for (DMMetaEnum.MetaAttrActions attrAction : attrActions) {HashMap<String, Object> map = new HashMap<>(1);map.put(VALUE, attrAction.getValue());map.put(LABEL, attrAction.getLabel());attrActionsList.add(map);}//合并mapList.addAll(attrActionsList);List<Map<String, String>> newList = new ArrayList<>();for (Map<String, Object> map : mapList) {Map<String, String> newMap = new HashMap<>();newMap.put(VALUE, map.get(VALUE).toString());newMap.put(LABEL, map.get(LABEL).toString());newList.add(newMap);}//去重(map中的key和value都是String类型)newList = newList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(m -> m.get(VALUE)))), ArrayList::new));return newList;}
newList = newList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(m -> m.get(VALUE)))), ArrayList::new));
6、list的filter过滤
① java8的方式
List<ActAtndLeave> approveInfoList_tmp =JacksonUtils.fromJson(JacksonUtils.toJson(approveInfoList), ArrayList.class,ActAtndLeave.class);List<ActAtndLeave> atndLeaveList_date = approveInfoList_tmp.stream().filter((ActAtndLeave leave) ->(leave.getStartTime().compareTo(fullWorkTime) >= 0 && leave.getStartTime().compareTo(fullOffWorkTime) <= 0)|| (leave.getEndTime().compareTo(fullWorkTime) >= 0 && leave.getEndTime().compareTo(fullOffWorkTime) <= 0)|| (fullWorkTime.compareTo(leave.getStartTime()) >= 0 && fullWorkTime.compareTo(leave.getEndTime()) <= 0)|| (fullOffWorkTime.compareTo(leave.getStartTime()) >= 0 && fullOffWorkTime.compareTo(leave.getEndTime()) <= 0)
).collect(Collectors.toList());
②java版本低于8的方式
如果java版本低于8,那么可以用下面ListUtils这个工具类
package com.icitic.hrms.util;/*** @author YangYQ* @since 2019-11-01 14:49**/
public interface ListUtilsHook<T> {public boolean test(T t);
}
package com.icitic.hrms.util;
import java.util.ArrayList;
import java.util.List;
/*** @author YangYQ* @since 2019-11-01 14:49**/
public class ListUtils {public static <T> List<T> filter(List<T> list, ListUtilsHook<T> hook) {ArrayList<T> r = new ArrayList<T>();for (T t : list) {if (hook.test(t)) {r.add(t);}}r.trimToSize();return r;}
}
使用方式
List clockList_dateMonth = this.jdbcTemplate.queryForList(sql_exception_new);//期间内的打卡记录
List<KqClockRecordBO> clockRecordBOList = JacksonUtils.fromJson(JacksonUtils.toJson(clockList_dateMonth),ArrayList.class, KqClockRecordBO.class);
// 1、当月缺卡信息查询
List<KqClockRecordBO> clockRecordBOList_this_MC = ListUtils.filter(clockRecordBOList,new ListUtilsHook<KqClockRecordBO>() {@Overridepublic boolean test(KqClockRecordBO bo) {return bo.getSIGN_IN_STATUS().equals(KqConstants.KQ_CLOCK_TYPE_MISSINGCARD);}});
7、java8 stream做统计(分组后取最大最小,排序)
原文链接
package com.lagou.multiThread.Test.pojo;import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class User2 implements Serializable {private static final long serialVersionUID = 1220193146286930256L;private String id;private String name;private String groupId;private int num;private int age;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public User2(String id, String name, String groupId, int num, int age) {this.id = id;this.name = name;this.groupId = groupId;this.num = num;this.age = age;}@Overridepublic String toString() {return "User{" +"id='" + id + '\'' +", name='" + name + '\'' +", groupId='" + groupId + '\'' +", num=" + num +", age=" + age +'}';}private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object, Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}public static void main(String[] args) {ArrayList<User2> list = new ArrayList<>(10);list.add(new User2("1", "1号", "A", 10, 10));list.add(new User2("2", "2号", "A", 20, 10));list.add(new User2("3", "3号", "E", 50, 12));list.add(new User2("4", "4号", "B", 60, 20));list.add(new User2("5", "5号", "C", 80, 40));list.add(new User2("6", "6号", "B", 220, 20));list.add(new User2("7", "7号", "A", 110, 2));list.add(new User2("8", "8号", "D", 110, 68));//去重复获取组System.out.println("----------去重复获取组-------------------");list.stream().filter(distinctByKey(User2::getGroupId)).map(User2::getGroupId).forEach(s -> {System.out.println(s);});//从第2个开始(下标)System.out.println("-------------从第2个开始----------------");list.stream().skip(2).forEach(s -> {System.out.println(s);});//取10以内的System.out.println("-------------取10以内的----------------");list.stream().filter(user -> user.getAge() <= 10).forEach(s -> {System.out.println(s);});//取最大System.out.println("----------------取最大-------------");User2 user = list.stream().max(Comparator.comparing(User2::getNum)).get();System.out.println(user);//分组求合System.out.println("---------------分组求合--------------");list.stream().collect(Collectors.groupingBy(User2::getGroupId, Collectors.summingInt(User2::getNum))).forEach((k, v) -> {System.out.println("K:" + k + "-V:" + v);});//分组取组内最大System.out.println("--------------分组取组内最大---------------");list.stream().collect(Collectors.groupingBy(User2::getGroupId, Collectors.maxBy(Comparator.comparingInt(User2::getNum)))).forEach((k, v) -> {System.out.println("K:" + k + "-V:" + v.get());});//分组取组内最小System.out.println("------------分组取组内最小-----------------");list.stream().collect(Collectors.groupingBy(User2::getGroupId, Collectors.minBy(Comparator.comparingInt(User2::getNum)))).forEach((k, v) -> {System.out.println("K:" + k + "-V:" + v.get());});//分组聚合多列System.out.println("---------------分组聚合多列计算--------------");list.stream().collect(Collectors.groupingBy(User2::getGroupId, Collectors.collectingAndThen(Collectors.toList(), users -> {Double[] ints = new Double[2];Double asDouble1 = users.stream().mapToInt(User2::getNum).average().getAsDouble();Double asDouble2 = users.stream().mapToInt(User2::getAge).average().getAsDouble();ints[0] = asDouble1;ints[1] = asDouble2;return ints;}))).forEach((k, v) -> {System.out.println("K:" + k + "-V:" + v[0] + "," + v[1]);});//分组后组内排序System.out.println("---------------分组后组内排序--------------");list.stream().collect(Collectors.groupingBy(User2::getGroupId, Collectors.collectingAndThen(Collectors.toList(), users -> {users.sort(Comparator.comparing(User2::getNum));return users;}))).forEach((k, v) -> {System.out.println("k:" + k);System.out.println("v----->:");v.forEach(s -> {System.out.println(s);});});}}
8、先用groupingBy分组,再使用joining将某个字段进行拼接
原文链接
public class User {private String name;private String age;private String groupId;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public User(String name, String age, String groupId) {this.name = name;this.age = age;this.groupId = groupId;}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {User user1 = new User("测试1", "21", "1");User user2 = new User("测试2", "22", "1");User user3 = new User("测试3", "23", "2");User user4 = new User("测试4", "24", "1");User user5 = new User("测试5", "25", "3");User user6 = new User("测试6", "26", "2");User user7 = new User("测试7", "27", "1");User user8 = new User("测试8", "28", "5");User user9 = new User("测试9", "29", "1");User user10 = new User("测试10", "30", "5");List<User> list = new ArrayList<User>();list.add(user1);list.add(user2);list.add(user3);list.add(user4);list.add(user5);list.add(user6);list.add(user7);list.add(user8);list.add(user9);list.add(user10);Map<String, String> collect = list.stream().collect(Collectors.groupingBy(User::getGroupId, Collectors.mapping(User::getName, Collectors.joining(","))));for (String groupId : collect.keySet()) {String names = collect.get(groupId);System.out.println(groupId + ":" + names);}}
}
Map<Integer, List<String>> map2 = list.stream().collect(Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.toList())));
截图
允许结果:
1:测试1,测试2,测试4,测试7,测试9
2:测试3,测试6
3:测试5
5:测试8,测试10
9、java8 两个List集合取交集、并集、差集
参考链接
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<String> list1 = new ArrayList<String>();list1.add("1");list1.add("2");list1.add("3");list1.add("5");list1.add("6");List<String> list2 = new ArrayList<String>();list2.add("2");list2.add("3");list2.add("7");list2.add("8");// 交集List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());System.out.println("---交集 intersection---");intersection.parallelStream().forEach(System.out::println);// 差集 (list1 - list2)List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());System.out.println("---差集 reduce1 (list1 - list2)---");reduce1.parallelStream().forEach(System.out::println);// 并集List<String> listAll = list1.parallelStream().collect(Collectors.toList());List<String> listAll2 = list2.parallelStream().collect(Collectors.toList());listAll.addAll(listAll2);System.out.println("---并集 listAll---");listAll.parallelStream().forEachOrdered(System.out::println);// 去重并集List<String> listAllDistinct = listAll.stream().distinct().collect(Collectors.toList());System.out.println("---得到去重并集 listAllDistinct---");listAllDistinct.parallelStream().forEachOrdered(System.out::println);System.out.println("---原来的List1---");list1.parallelStream().forEachOrdered(System.out::println);System.out.println("---原来的List2---");list2.parallelStream().forEachOrdered(System.out::println);}
}
java8 stream 的list处理相关推荐
- JAVA8 Stream方法使用详解reduce、IntStream(二)
文章目录 一 归约 1.元素求和 2.最大值和最小值 二.数值流 1.映射数值流 2.转换对象流 3.数值范围 三.构建流 1.由值创建流 2.由数组创建流 3.由文件生成流 4.由函数生成流 此章节 ...
- 怎么break java8 stream的foreach
文章目录 简介 使用Spliterator 自定义forEach方法 总结 怎么break java8 stream的foreach 简介 我们通常需要在java stream中遍历处理里面的数据,其 ...
- java8 stream案例分析
java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格. ...
- java多字段排序,java8 stream多字段排序的实现
很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...
- 简洁又快速地处理集合——Java8 Stream(下)
上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...
- Java8 stream().map()将对象转换为其他对象
Java8 stream().map()将对象转换为其他对象 1: 将对象List转为List public class user{private String name;private String ...
- java8 Stream的实现原理 (从零开始实现一个stream流)
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted
0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...
- Java基础学习总结(132)——Java8 Stream流操作学习总结
传统的数据处理都是用循环来解决,而不是像搜索数据库那样有具体的搜索语句,而Java8的Stream提供了很好的方案,往往一行就搞定了,而且Stream还可以链式操作,一行代码实现多个循环的功能,代码风 ...
- java8 stream().map().collect()用法
java8 stream().map().collect()用法 有一个集合: List<User> users = getList(); //从数据库查询的用户集合 现在想获取User的 ...
最新文章
- 【亲测可用】用Electron和electron-builder打包Vue项目为exe可执行文件安装包(不推荐,个人觉得没有VNISEdit和NW好用,而且有些配置文件还挺脑残!)
- python取出字典中的所有值的两种方法
- Java实现选择排序及其优化
- Laravel学习笔记(四)数据库 数据库迁移案例
- 数据库-笛卡尔积-内连接
- sql中问号是干什么的??
- Oracle中row_number()、rank()、dense_rank() 的区别
- 修改mysql文件的存储路径
- 【Elasticsearch】实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分
- R 多变量数据预处理_超长文详解:C语言预处理命令
- POJ 1001 Exponentiation
- 手摸手,一起整理前端小小小知识
- matlab2c使用c++实现matlab函数系列教程-range函数
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)转载自码农网
- Linux系统中常用的shell命令(文件目录操作)
- cartographer 代码思想解读(9)- 激光雷达畸变矫正
- C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]
- Excel打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”最快的解决办法
- 基于51单片机的温度采集系统的设计四位数码管显示温度
- 【网络设备】交换机相同VLAN之间互通