1. 程式人生 > 程式設計 >java8實現list集合中按照某一個值相加求和,平均值等操作程式碼

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

    //根據多條件組合排序,再根據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());

    //根據多條件組合排序,再根據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,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,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集合中按照某一個值相加求和,平均值等操作程式碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。