2016-06-18 6 views
-5

Map<Long, Set<String>>を作成する代わりに、Java 8のgroupingBy関数から直接Map<Long, String>を直接作成する方法はありますか?リストを返さずにJava 8ストリームのグループ化

I次のコードを持っている:私は必要

List<Object[]> list = new ArrayList<>(); 
//row[0] is the primary key and row[1] is the name of the employee 
Object[] input1 = { 1l, "employee1", null}; 
Object[] input2 = { 1l, "employee1", "vorw2"}; 
Object[] input3 = { 2l, "employee2", "vorw3"}; 
Object[] input4 = { 3l, "employee3", "vorw1"}; 
list.add(input1); 
list.add(input2); 
list.add(input3); 
list.add(input4); 

//code to replaced 
Map<String, Set<String>> byPK= list.stream().collect(Collectors.groupingBy(row -> row[0].longValue(), Collectors.mapping(row -> row[1].toString(),Collectors.toSet()))); 

をO/Pのような:

List ==> (1l, "employee1"), (2l,"employee2"), (3l, "employee3"). 
+1

リストには1つのジェネリックタイプがあります。リストは存在しません。意味のある投稿コードをコンパイルします。また、Javaの基本的な命名規則を尊重してください。変数は小文字で始まります。 –

+0

私を変えてくれてありがとう、私はリストで地図を置き換えた。編集して問題を修正しました。 – Mango

+1

まだコンパイルされません(add()は3)ではなく1つの引数を取りますが、それでも命名規則は尊重しません。一歩踏み込んでIDEを開き、IDEでコンパイルされたコードを書いてから、あなたの質問を修正してください。 –

答えて

3

必要なのは、現在の従業員の名前を保持しますマージ機能付きtoMap()であり、 (新しいものと同等である必要があるため):

Map<Long , String> employeeNamesById = 
    list.stream() 
     .collect(Collectors.toMap(array -> (Long) array[0], 
            array -> (String) array[1], 
            (name1, name2) -> name1)); 
System.out.println("employeeNamesById = " + employeeNamesById); 
// prints employeeNamesById = {1=employee1, 2=employee2, 3=employee3} 
関連する問題