溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java8實現(xiàn)list集合中按照某一個值相加求和,平均值的方法

發(fā)布時間:2020-08-19 10:59:53 來源:億速云 閱讀:4630 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下java8實現(xiàn)list集合中按照某一個值相加求和,平均值的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

集合:

List<User> user = new User();

user .stream().collect(Collectors.summingInt(User::getAge))

參數(shù)類型:

summarizingDouble 統(tǒng)計數(shù)據(jù)(double)狀態(tài), 其中包括count min max sum和平均值

summarizingInt 統(tǒng)計數(shù)據(jù)(int)狀態(tài), 其中包括count min max sum和平均值

summarizingLong 統(tǒng)計數(shù)據(jù)(long)狀態(tài), 其中包括count min max sum和平均值.

summingInt 求和 返回int類型

summingDouble 求和 返回double類型

summingLong 求和 返回long類型

counting 返回Stream的元素個數(shù)

averagingDouble 求平均值 返回double類型

averagingInt 求平均值 返回int類型

averagingLong 求平均值 返回long類型

maxBy 在指定條件下,返回最大值

minBy 在指定條件下,返回最小值

補充知識:Java8集合List排序、篩選、求和、求最大值、平均值、List轉(zhuǎn)Map

Java8集合List排序、篩選

1. List

元素有序

元素可重復(fù)

1.1 ArrayList

動態(tài)數(shù)組實現(xiàn)

查詢快

增刪慢(末尾處也快)

1.2 LinkedList

鏈表實現(xiàn)

查詢慢

增刪快

1.3 ArrayList和LinkedList比較

實現(xiàn)查詢增刪線程安全&#63;
ArrayList動態(tài)數(shù)組慢(末尾處也快)不安全
LinkedList鏈表不安全

ArrayList:

它的默認初始化容量是10,每次擴容時候增加原先容量的一半,也就是變?yōu)樵瓉淼?.5倍。

LinkedList:

底層實現(xiàn)是雙向鏈表。

在增加和刪除元素時效率較高。

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));

      //根據(jù)Id升序排序
      list.sort((a, b) -> a.getId().compareTo(b.getId()));

      //根據(jù)Id升序排序(簡寫)
      list.sort(Comparator.comparing(Message::getId));

      //根據(jù)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));

    //根據(jù)多條件組合排序,先根據(jù)msg(升序),再根據(jù)id(升序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId));

    //根據(jù)多條件組合排序,先根據(jù)msg(升序),再根據(jù)id(降序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Comparator.comparing(Message::getId).reversed()));

    //根據(jù)多條件組合排序,先根據(jù)msg(降序),再根據(jù)id(降序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId).reversed());

    //根據(jù)多條件組合排序,先根據(jù)msg(降序),再根據(jù)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>轉(zhuǎn)List<Object>

List<Long> idList =

list.stream().map(Message::getId).collect(Collectors.toList());

1.6.1 List<T>轉(zhuǎn)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>轉(zhuǎn)Map<String, T>

還是上面的測試數(shù)據(jù),按Message的msg作為key,如果key重復(fù)就用第一個.

 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"的數(shù)據(jù),轉(zhuǎn)map后取第一條

java8實現(xiàn)list集合中按照某一個值相加求和,平均值的方法

1.7.1 forEach遍歷Map

    map.forEach((k,v) -> {
      System.out.println(k + " -> " + v);
    });

1.8 List<T>轉(zhuǎn)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>>轉(zhuǎn)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實現(xiàn)list集合中按照某一個值相加求和,平均值的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI