簡體   English   中英

GroupingBy 在 java 流 API

[英]GroupingBy in java streams API

輸入:

在此處輸入圖像描述

OutPut:SessionId TimeSpent
123 15
124 2

我必須計算每個 session 花費的總時間。 我已經嘗試了下面的代碼來獲得高於 output 的代碼。

List<IsolatedTrafficPerSession> l  = new ArrayList();
        Map<String,Map<String,List<IsolatedDetailQueryResponseDTO>>> mapg = list.stream().collect(Collectors.groupingBy(IsolatedDetailQueryResponseDTO::getIsolateSessionId, Collectors.groupingBy(IsolatedDetailQueryResponseDTO::getIsolateTabId)));
        for(String sessionid: mapg.keySet()){
            int timeSpent  = 0;
            Map<String,List<IsolatedDetailQueryResponseDTO>> m = mapg.get(sessionid);
             for(String tabId: m.keySet()){
                 for(IsolatedDetailQueryResponseDTO isolatedDetailQueryResponseDTO: m.get(tabId)){
                     if(isolatedDetailQueryResponseDTO.getIsolateType() == 0) {
                         timeSpent = timeSpent+ isolatedDetailQueryResponseDTO.getCreatedTimestamp();
                     }
                    
                 }

             }
            IsolatedTrafficPerSession isolatedTrafficPerSession = new IsolatedTrafficPerSession();
             isolatedTrafficPerSession.setSession_id(sessionid);
             isolatedTrafficPerSession.setTimeSpent(timeSpent);
             l.add(isolatedTrafficPerSession);

        }`

但是我的代碼看起來需要 O(n^3) 時間復雜度。 有沒有更好的解決方案來超越我的輸出。

對於您的情況, GroupingBy可能是多余的。 您可以將Map返回values集合。

代碼片段:

public static Collection<IsolatedTrafficPerSession> groupBasedOnSessionId(List<IsolatedDetailQueryResponseDTO> list) {
    return list.stream()
               .collect(Collectors.toMap(
                       IsolatedDetailQueryResponseDTO::getIsolateSessionId,
                       dto -> new IsolatedTrafficPerSession()
                               .setSession_id(dto.getIsolateSessionId())
                               .setTimeSpent(dto.getIsolateType() == 0 ? dto.createdTimestamp : 0),
                       ( v1, v2) -> v1.setTimeSpent(v1.getTimeSpent() + v2.getTimeSpent())))
               .values();
}

測試:

public static void main(String[] args) {
    List<IsolatedDetailQueryResponseDTO> input = Arrays.asList(
            new IsolatedDetailQueryResponseDTO("123", "0", 1, 0),
            new IsolatedDetailQueryResponseDTO("123", "1", 2, 0),
            new IsolatedDetailQueryResponseDTO("124", "0", 2, 0),
            new IsolatedDetailQueryResponseDTO("123", "0", 0, 10),
            new IsolatedDetailQueryResponseDTO("123", "1", 0, 5),
            new IsolatedDetailQueryResponseDTO("124", "0", 0, 2));

    Collection<IsolatedTrafficPerSession> result = groupBasedOnSessionId(input);
    result.forEach(System.out::println);
}

Output:

123 15
124 2

筆記:

  1. 使用了如下的IsolatedTrafficPerSession的流利樣式設置器。
     public IsolatedTrafficPerSession setSession_id(String sessionId) { this.sessionId = sessionId; return this; }
  2. 用於IsolatedDetailQueryResponseDTO的構造函數:
     public IsolatedDetailQueryResponseDTO(String isolateSessionId, String isolateTabId, int isolateType, int createdTimestamp) { this.isolateSessionId = isolateSessionId; this.isolateTabId = isolateTabId; this.isolateType = isolateType; this.createdTimestamp = createdTimestamp; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM