java8实现list集合中按照某⼀个值相加求和,平均值等操作
代码
集合:
List<User> user = new User();
user .stream().collect(Collectors.summingInt(User::getAge))
参数类型:
summarizingDouble 统计数据(double)状态, 其中包括count min max sum和平均值
summarizingInt 统计数据(int)状态, 其中包括count min max sum和平均值
summarizingLong 统计数据(long)状态, 其中包括count min max sum和平均值.
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.1 ArrayList
动态数组实现
查询快
增删慢(末尾处也快)
1.2 LinkedList
链表实现
查询慢
增删快
1.3 ArrayList和LinkedList⽐较
实现查询增删线程安全?
ArrayList动态数组快慢(末尾处也快)不安全
LinkedList链表慢快不安全
ArrayList:
它的默认初始化容量是10,每次扩容时候增加原先容量的⼀半,也就是变为原来的1.5倍。LinkedList:
底层实现是双向链表。
在增加和删除元素时效率较⾼。
1.4 List过滤指定元素
1.4.1 准备待测试的List
public class Message {
private Long id;  //id
private String msg; //消息
private Date sendTime; //时间戳
//省略get set
}
//返回⼀个List
private static List<Message> getMessageList(){
List<Message> list = new ArrayList<>();
list.add(new Message(1L, "a", new Date()));
list.add(new Message(2L, "b", new Date()));
list.add(new Message(4L, "b", new Date()));
list.add(new Message(3L, "c", new Date()));
return list;
}
1.4.2 使⽤Iterator遍历List
private static void TestArrayList(){
List<Message> list = getMessageList();
System.out.print("删除前:");
list.stream().forEach(item -> System.out.print(item));
Iterator<Message> it = list.iterator();
while (it.hasNext()) {
Message s = it.next();
if (s.getMsg().equals("b")) {
}
}
System.out.print("\n删除后:");
list.stream().forEach(item -> System.out.print(item));
}
1.4.2 使⽤Java8对List过滤筛选
private static void filterList(){
List<Message> list1 = getMessageList();
//过滤所有msg是b的记录
List<Message> list2 = list1.stream().filter(s -> !s.getMsg().equals("b")).List());
list2.stream().forEach(item -> System.out.println(item));
}
1.4.3 使⽤distinct去重
//使⽤distinct去重
List<String> distinctMsg = list.stream().map(Message::getMsg).distinct().List()); distinctMsg.forEach(System.out::println);
1.4.4 使⽤toSet去重
//使⽤collect(toSet())去重
Set<String> distinctMsg2 = list.stream().map(Message::getMsg).collect(toSet());
distinctMsg2.forEach(System.out::println);
1.5 使⽤Java8对List排序
1.5.1 单个字段排序
private static void sortList(){
List<Message> list = getMessageList();
if (list != null && !list.isEmpty()){
System.out.println("===排序前如下===");
list.stream().forEach(item -> System.out.println(item));
//根据Id升序排序
list.sort((a, b) -> a.getId()Id()));
//根据Id升序排序(简写)
list.sort(Comparatorparing(Message::getId));
//根据Id降序排序(简写)
list.sort(Comparatorparing(Message::getId).reversed());
System.out.println("===排序后如下===");
list.stream().forEach(item -> System.out.println(item));
}
}
1.5.2 多个字段组合排序
private static void sortList(){
List<Message> list = getMessageList();
if (list != null && !list.isEmpty()){
System.out.println("===排序前如下===");
list.stream().forEach(item -> System.out.println(item));
//根据多条件组合排序,先根据msg(升序),再根据id(升序)
list.sort(Comparatorparing(Message:: getMsg).thenComparing(Message::getId));
/
/根据多条件组合排序,先根据msg(升序),再根据id(降序)
list.sort(Comparatorparing(Message:: getMsg).thenComparing(Comparatorparing(Message::getId).reversed()));    //根据多条件组合排序,先根据msg(降序),再根据id(降序)
list.sort(Comparatorparing(Message:: getMsg).thenComparing(Message::getId).reversed());
//根据多条件组合排序,先根据msg(降序),再根据id(升序)
list.sort(Comparatorparing(Message:: getMsg).reversed().thenComparing(Message::getId));
System.out.println("===排序后如下===");
list.stream().forEach(item -> System.out.println(item));
}
}
1.6 List<T>转List<Object>
List<Long> idList =
list.stream().map(Message::getId).List());
1.6.1 List<T>转List<Object> +去重
//利⽤distinct()
List<String> msgList =
list.stream().map(Message::getMsg).distinct().List());
//利⽤Set()
Set<String> msgList2 =
list.stream().map(Message::getMsg).Set());
1.7 List<T>转Map<String, T>
还是上⾯的测试数据,按Message的msg作为key,如果key重复就⽤第⼀个.
private static void listToMap(){
List<Message> list = getMessageList();
Map<String, Message> map =
list.stream().Map(Message :: getMsg, a-> a, (k1, k2) -> k1));
System.out.println(map.size());
}
原本List有4个元素,因为有2条msg="b"的数据,转map后取第⼀条
1.7.1 forEach遍历Map
map.forEach((k,v) -> {
System.out.println(k + " -> " + v);
});
1.8 List<T>转Map<String, List<T>>
Map<String, List<Message>> groupByMsg = list.stream().collect(groupingBy(Message::getMsg));
groupByMsg.forEach((k, v) -> {java集合排序怎么实现
System.out.println(k + " -> " + v.toString());
});
返回如下:
a -> [Message(id=1, msg=a, sendTime=Fri May 15 17:36:30 CST 2020)]
b -> [Message(id=2, msg=b, sendTime=Fri May 15 17:36:30 CST 2020), Message(id=4, msg=b, sendTime=Fri May 15 17:36:30 CST 2020)]
c -> [Message(id=3, msg=c, sendTime=Fri May 15 17:36:30 CST 2020)]
1.9 List<Map<String, Object>>转Map<String, List<Map<String, Object>>>
Map<String, List<Map<String, Object>>> groupByGenderMap =
pigMapList.stream().collect(groupingBy(e -> e.get("gender").toString()));
1.10 List求和、求最⼤值、平均值
private static void statisticsList(){
List<Message> list = getMessageList();
//求和
Long sum= list.stream().mapToLong(Message::getId).sum();
System.out.println("sum = " + sum);
//求最⼤值
Optional<Message> maxMassage = list.stream().collect(Collectors.maxBy(Comparatorparing(Message::getId)));
Long maxId = ().getId();
System.out.println("maxId = " + maxId);
LongSummaryStatistics lss = list.stream().collect(Collectors.summarizingLong(Message::getId));
System.out.println("sum = " + Sum());
System.out.println("max = " + Max());
System.out.println("min = " + Min());
System.out.println("avg = " + Average());
}
以上这篇java8实现list集合中按照某⼀个值相加求和,平均值等操作代码就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。