2016-11-04 25 views
2

我是Java新手,如果這已經在其他地方得到了回答,那麼我要麼不知道搜索正確的東西,要麼我無法理解答案。Java8流中集合中對象屬性的平均值

所以,問題的存在: 我有一大堆對象的列表:

try(Stream<String> logs = Files.lines(Paths.get(args))) { 

     return logs.map(LogLine::parseLine).collect(Collectors.toList()); 


    } 

這是屬性的方式補充說:

 LogLine line = new LogLine(); 
    line.setUri(matcher.group("uri")); 
    line.setrequestDuration(matcher.group("requestDuration")); 
    .... 

我怎麼排序日誌所以我最終列出了具有相同「uri」的對象僅在平均requestDuration中顯示一次。

例子:

  object1.uri = 'uri1', object1.requestDuration = 20; 
     object2.uri = 'uri2', object2.requestDuration = 30; 
     object3.uri = 'uri1', object3.requestDuration = 50; 

結果:

 object1.uri = 'uri1', 35; 
     object2.uri = 'uri2', 30; 

提前感謝!

回答

5

看看Collectors.groupingByCollectors.averagingDouble

Map<String, Double> result = logLines.stream() 
    .collect(Collectors.groupingBy(
     LogLine::getUri, 
     TreeMap::new, 
     Collectors.averagingDouble(LogLine::getRequestDuration))); 

Collectors.groupingBy方法,你想要做什麼:你的情況,你可以按如下方式使用它們。它被重載了,這樣你就可以指定返回鍵的函數了,這個函數返回創建返回地圖的工廠(我在這裏使用TreeMap,因爲你希望按鍵排序,在這個例子中是URI) ,以及下游收集器,收集與第一個參數返回的鍵相匹配的元素。

如果您想要Integer而不是Double平均值,請考慮使用Collectors.averagingInt

這裏假設LogLinegetUri()getRequestDuration()方法。

相關問題