java8实现list集合中按照某一个值相加求和,平均值等操作代码
集合:
List
user=newUser(); user.stream().collect(Collectors.summingInt(User::getAge))
参数类型:
summarizingDouble统计数据(double)状态,其中包括countminmaxsum和平均值
summarizingInt统计数据(int)状态,其中包括countminmaxsum和平均值
summarizingLong统计数据(long)状态,其中包括countminmaxsum和平均值.
summingInt求和返回int类型
summingDouble求和返回double类型
summingLong求和返回long类型
counting返回Stream的元素个数
averagingDouble求平均值返回double类型
averagingInt求平均值返回int类型
averagingLong求平均值返回long类型
maxBy在指定条件下,返回最大值
minBy在指定条件下,返回最小值
补充知识:Java8集合List排序、筛选、求和、求最大值、平均值、List转Map
Java8集合List排序、筛选
1.List
元素有序
元素可重复
1.1ArrayList
动态数组实现
查询快
增删慢(末尾处也快)
1.2LinkedList
链表实现
查询慢
增删快
1.3ArrayList和LinkedList比较
实现 | 查询 | 增删 | 线程安全? | |
---|---|---|---|---|
ArrayList | 动态数组 | 快 | 慢(末尾处也快) | 不安全 |
LinkedList | 链表 | 慢 | 快 | 不安全 |
ArrayList:
它的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍。
LinkedList:
底层实现是双向链表。
在增加和删除元素时效率较高。
1.4List过滤指定元素
1.4.1准备待测试的List
publicclassMessage{ privateLongid;//id privateStringmsg;//消息 privateDatesendTime;//时间戳 //省略getset }
//返回一个List privatestaticListgetMessageList(){ List list=newArrayList<>(); list.add(newMessage(1L,"a",newDate())); list.add(newMessage(2L,"b",newDate())); list.add(newMessage(4L,"b",newDate())); list.add(newMessage(3L,"c",newDate())); returnlist; }
1.4.2使用Iterator遍历List
privatestaticvoidTestArrayList(){ Listlist=getMessageList(); System.out.print("删除前:"); list.stream().forEach(item->System.out.print(item)); Iterator it=list.iterator(); while(it.hasNext()){ Messages=it.next(); if(s.getMsg().equals("b")){ it.remove(); } } System.out.print("\n删除后:"); list.stream().forEach(item->System.out.print(item)); }
1.4.2使用Java8对List过滤筛选
privatestaticvoidfilterList(){ Listlist1=getMessageList(); //过滤所有msg是b的记录 List list2=list1.stream().filter(s->!s.getMsg().equals("b")).collect(Collectors.toList()); list2.stream().forEach(item->System.out.println(item)); }
1.4.3使用distinct去重
//使用distinct去重 ListdistinctMsg=list.stream().map(Message::getMsg).distinct().collect(Collectors.toList()); distinctMsg.forEach(System.out::println);
1.4.4使用toSet去重
//使用collect(toSet())去重 SetdistinctMsg2=list.stream().map(Message::getMsg).collect(toSet()); distinctMsg2.forEach(System.out::println);
1.5使用Java8对List排序
1.5.1单个字段排序
privatestaticvoidsortList(){ Listlist=getMessageList(); if(list!=null&&!list.isEmpty()){ System.out.println("===排序前如下==="); list.stream().forEach(item->System.out.println(item)); //根据Id升序排序 list.sort((a,b)->a.getId().compareTo(b.getId())); //根据Id升序排序(简写) list.sort(Comparator.comparing(Message::getId)); //根据Id降序排序(简写) list.sort(Comparator.comparing(Message::getId).reversed()); System.out.println("===排序后如下==="); list.stream().forEach(item->System.out.println(item)); } }
1.5.2多个字段组合排序
privatestaticvoidsortList(){ Listlist=getMessageList(); if(list!=null&&!list.isEmpty()){ System.out.println("===排序前如下==="); list.stream().forEach(item->System.out.println(item)); //根据多条件组合排序,先根据msg(升序),再根据id(升序) list.sort(Comparator.comparing(Message::getMsg).thenComparing(Message::getId)); //根据多条件组合排序,先根据msg(升序),再根据id(降序) list.sort(Comparator.comparing(Message::getMsg).thenComparing(Comparator.comparing(Message::getId).reversed())); //根据多条件组合排序,先根据msg(降序),再根据id(降序) list.sort(Comparator.comparing(Message::getMsg).thenComparing(Message::getId).reversed()); //根据多条件组合排序,先根据msg(降序),再根据id(升序) list.sort(Comparator.comparing(Message::getMsg).reversed().thenComparing(Message::getId)); System.out.println("===排序后如下==="); list.stream().forEach(item->System.out.println(item)); } }
1.6List
List
list.stream().map(Message::getId).collect(Collectors.toList());
1.6.1List
//利用distinct() ListmsgList= list.stream().map(Message::getMsg).distinct().collect(Collectors.toList()); //利用Collectors.toSet() Set msgList2= list.stream().map(Message::getMsg).collect(Collectors.toSet());
1.7List
还是上面的测试数据,按Message的msg作为key,如果key重复就用第一个.
privatestaticvoidlistToMap(){ Listlist=getMessageList(); Map map= list.stream().collect(Collectors.toMap(Message::getMsg,a->a,(k1,k2)->k1)); System.out.println(map.size()); }
原本List有4个元素,因为有2条msg="b"的数据,转map后取第一条
1.7.1forEach遍历Map
map.forEach((k,v)->{ System.out.println(k+"->"+v); });
1.8List
Map>groupByMsg=list.stream().collect(groupingBy(Message::getMsg)); groupByMsg.forEach((k,v)->{ System.out.println(k+"->"+v.toString()); });
返回如下:
a->[Message(id=1,msg=a,sendTime=FriMay1517:36:30CST2020)] b->[Message(id=2,msg=b,sendTime=FriMay1517:36:30CST2020),Message(id=4,msg=b,sendTime=FriMay1517:36:30CST2020)] c->[Message(id=3,msg=c,sendTime=FriMay1517:36:30CST2020)]
1.9List
Map
>>groupByGenderMap= pigMapList.stream().collect(groupingBy(e->e.get("gender").toString()));
1.10List求和、求最大值、平均值
privatestaticvoidstatisticsList(){ Listlist=getMessageList(); //求和 Longsum=list.stream().mapToLong(Message::getId).sum(); System.out.println("sum="+sum); //求最大值 Optional maxMassage=list.stream().collect(Collectors.maxBy(Comparator.comparing(Message::getId))); LongmaxId=maxMassage.get().getId(); System.out.println("maxId="+maxId); LongSummaryStatisticslss=list.stream().collect(Collectors.summarizingLong(Message::getId)); System.out.println("sum="+lss.getSum()); System.out.println("max="+lss.getMax()); System.out.println("min="+lss.getMin()); System.out.println("avg="+lss.getAverage()); }
以上这篇java8实现list集合中按照某一个值相加求和,平均值等操作代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。