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));
Iteratorit=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的记录
Listlist2=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();
Mapmap=
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);
//求最大值
OptionalmaxMassage=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。