2017-11-06 5 views
4

がストリームに新しいですが、それほどではない...これは私の問題である:リストストリームをマップに分割すると、カスタムコレクターが必要になるのですか?

私はexeファイルの上にのいくつかの種類を持つユーザーを持っているPCから読んでいますリストを持っています...

:私は Map<String, String>

{USER1 = READ-WRITE-EXECUTE-DELETE, USER2 = READ-WRITE, USER3 = READ} 

などを持っていると思いますが、私のコードが生成され

List<String> xyzList = new ArrayList<>(); 
xyzList.add("USER1.READ"); 
xyzList.add("USER1.WRITE"); 
xyzList.add("USER1.EXECUTE"); 
xyzList.add("USER1.DELETE"); 
xyzList.add("USER2.READ"); 
xyzList.add("USER3.READ"); 
xyzList.add("USER2.EXECUTE"); 

のような文字列に見えるように私が得たリスト
{USER1=USER1.READ-USER1.WRITE-USER1.EXECUTE-USER1.DELETE, USER2=USER2.READ-USER2.EXECUTE, USER3=USER3.READ} 

私は値のセットを編集することができますが、その結果を扱うことを決めるのはわかりますが、ただ1つのストリーム命令でそれを取得するよりエレガントな方法を探しています。そのために...

は...これまで

Map<String, String> result = xyzList 
     .stream() 
     .collect(
      Collectors.groupingBy(x -> x.split("\\.")[0], 
      Collectors.joining("-", "", "") 
     )); 

System.out.println(result); 

どんな提案をしてみてください、私の?

+0

ストリップ '' mapping' Collector'の最初の部分。 –

答えて

14

このような何か(あなたがところで本当に接近していた):

xyzList.stream() 
     .map(x -> x.split("\\.")) 
     .collect(
      Collectors.groupingBy(arr -> arr[0], 
      Collectors.mapping(
         arr -> arr[1], 
         Collectors.joining("-")))) 
+0

はい...それは正確に何が必要なのですか...あなたがCollectorsについて少し詳しく説明できたら...マッピングはすばらしいことでしょう。 – FlascheLeer

+0

@FlascheLeer私は何を言うべきか分からない。 ..基本的にそれらを収集する前に要素にマッピングする(関数を適用する) – Eugene

+0

@FlascheLeer実際には、今日ここでこれらのことについての素晴らしい説明があります:https://stackoverflow.com/questions/47125135/how-to-aggregate-operations- work-on-java-streams/47158659#47158659 – Eugene

関連する問題