2016-11-07 7 views
0

私は、ステップバイステップで行う必要があることを書き留めて、これまで説明したコードを長いテキストで説明するのではなくコピーする方が簡単だと思います。Javaストリームのプロセスの順番

これは私がしなければならないものです:

  1. 読むファイルの行ラインでこれらの行で
  2. 地図キー
  3. は、1つのキー(次のコードでのgetURI)によってラインをマージし、(平均取得します他のキー(getRequestDuration))の
  4. の平均値を返します。
  5. 戻り値は最高です。

そして、これは私が今得たものである:

try(Stream<String> logs = Files.lines(Paths.get(args))) {   
    logs.map(LogLine::parseLine).limit(10).sorted((e1, e2) -> Integer.compare(e1.getRequestDuration(), 
     e2.getRequestDuration())) 
     .collect(Collectors.groupingBy(
     LogLine::getUri, 
     Collectors.averagingDouble(LogLine::getRequestDuration))); 
    return logs; 

私はので、私は私が誰かが私のために答えることを願っての質問のカップルを持っているJavaへの新たなんだ:

  1. 方法ソートする前にグループを収集した後にソートしますか?
  2. 正しく制限する方法は?それで、私は何回通過するのではなく、私が返すエントリーの量を制限します。

ストリームはどのように動作するのか分かりますが、実際の使用には問題があります。 私は、私が直面している問題の完全なコードを探しているわけではなく、それを行う方法を理解するために必要な情報を私に提供できる人ではありません。誰かがストリームでこのような問題に取り組む方法を書いたのであれば、私は非常に感謝しています。

答えて

2

あなたはURIでグルーピングし、平均期間を値で、結果マップから値でソートし、期待される結果の数を制限することができます。

Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration))); 

だけ単独で、代わりに `Comparator.comparing(の

List<Double> filteredList = uriDurationMap.values().stream().sorted().limit(10).collect(Collectors.toList()); 
+1

を必要な値場合LinkedHashMap

Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k,v) -> v, LinkedHashMap::new)); 

を使用する順序を維持するためにマップ

Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

からソートおよびフィルタMap.Entry :: getValue) '、あなたは私たちにできるe 'Map.Entry.comparingByValue()' – Holger

+1

@Holgerああ、私はこの拡張を知らなかった、ありがとう – Saravana

関連する問題