java streams api中的groupingby

eaf3rand  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(297)

输入:

输出:sessionid timespent
123 15
124 2
我必须计算每节课的总时间。我已经尝试了下面的代码来获得上面的输出。

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)时间复杂度。有没有更好的办法来克服我的困难。

ovfsdjhp

ovfsdjhp1#

对你来说, GroupingBy 可能是多余的。您只需将DTO收集到 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);
}

输出:

123 15
124 2

注:
使用流畅的样式设置器 IsolatedTrafficPerSession 如下所示。

public IsolatedTrafficPerSession setSession_id(String sessionId) {
        this.sessionId = sessionId;
        return this;
    }

用于 IsolatedDetailQueryResponseDTO :

public IsolatedDetailQueryResponseDTO(String isolateSessionId, String isolateTabId, int isolateType, int createdTimestamp) {
       this.isolateSessionId = isolateSessionId;
       this.isolateTabId = isolateTabId;
       this.isolateType = isolateType;
       this.createdTimestamp = createdTimestamp;
   }

相关问题