[英]Java 8 Streams API HAVING clause equivalent in a GroupingBy?
[英]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
筆記:
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; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.