温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java8实现list集合中按照某一个值相加求和,平均值的方法

发布时间:2020-08-19 10:59:53 来源:亿速云 阅读:4593 作者:小新 栏目:开发技术

小编给大家分享一下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比较

实现查询增删线程安全&#63;
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后取第一条

java8实现list集合中按照某一个值相加求和,平均值的方法

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集合中按照某一个值相加求和,平均值的方法有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI