java8实现list集合中按照某一个值相加求和,平均值等操作代码

 更新时间:2020年08月17日 08:39:41   作者:冯小胖 Mini胖  
这篇文章主要介绍了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")) {
        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集合中按照某一个值相加求和,平均值等操作代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈对于DAO设计模式的理解

    浅谈对于DAO设计模式的理解

    这篇文章主要介绍了浅谈对于DAO设计模式的理解,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • Java Bean转Map的那些踩坑实战

    Java Bean转Map的那些踩坑实战

    项目中有时会遇到Map转Bean,Bean转Map的情况,下面这篇文章主要给大家介绍了关于Java Bean转Map那些踩坑的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • java中元素排序Comparable和Comparator的区别

    java中元素排序Comparable和Comparator的区别

    本文主要介绍了java中元素排序Comparable和Comparator的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 基于Consumer接口、Predicate接口初使用

    基于Consumer接口、Predicate接口初使用

    这篇文章主要介绍了Consumer接口、Predicate接口初使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • spring缓存代码详解

    spring缓存代码详解

    这篇文章主要介绍了spring缓存代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Spring详细讲解FactoryBean接口的使用

    Spring详细讲解FactoryBean接口的使用

    这篇文章主要为大家介绍了Spring容器FactoryBean工厂实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java实战之王者荣耀的英雄是怎么产生的?

    Java实战之王者荣耀的英雄是怎么产生的?

    这篇文章主要介绍了Java实战之王者荣耀的英雄是怎么产生的?文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Idea设置全局highlighting level为Syntax问题

    Idea设置全局highlighting level为Syntax问题

    这篇文章主要介绍了Idea设置全局highlighting level为Syntax问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java 在PDF中绘制形状的两种方法

    Java 在PDF中绘制形状的两种方法

    这篇文章主要介绍了Java 在 PDF 中绘制形状的两种实现方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java枚举(enum) 详解7种常见的用法

    Java枚举(enum) 详解7种常见的用法

    这篇文章主要介绍了Java枚举(enum) 详解7种常见的用法,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11

最新评论