时间:2021-05-19
集合:
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}//返回一个Listprivate 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")) { it.remove(); } } 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")).collect(Collectors.toList()); list2.stream().forEach(item -> System.out.println(item));}1.4.3 使用distinct去重
//使用distinct去重List<String> distinctMsg = list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());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().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 多个字段组合排序
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(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.6 List<T>转List<Object>
List<Long> idList =
list.stream().map(Message::getId).collect(Collectors.toList());
1.6.1 List<T>转List<Object> +去重
//利用distinct()List<String> msgList = list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());//利用Collectors.toSet()Set<String> msgList2 = list.stream().map(Message::getMsg).collect(Collectors.toSet());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().collect(Collectors.toMap(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) -> { 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(Comparator.comparing(Message::getId))); Long maxId = maxMassage.get().getId(); System.out.println("maxId = " + maxId); LongSummaryStatistics lss = 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集合中按照某一个值相加求和,平均值等操作代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在java开发中,我们经常会遇到需要从一个集合中,抽取集合中元素的某一个属性。在java8之前,我们通常采用for循环去获取,但java8之后我们有了一种新的办
需求键盘输入五名学生信息并录入list集合;输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值;计算并输出他们Java语言成绩的最大值和最小值。思
1、valueForKeyPath可以获取数组中的最小值、最大值、平均值、求和。代码如下:NSArray*array=@[@10,@23,@43,@54,@7,
复制代码代码如下:/给三个整数从小到大排序并求和及其平均值//其中,三个待求整数及其排序的结果由引用参数传递;其和由输出参数传递;平均值由返回值返回。//在Ma
x上面一横的意思是: 这个符号念做“Xbar”,为求平均值符号。 平均值有,算术平均值,几何平均值,平方平均值,调和平均值,加权平均值等几种。其中以算术平均