2016-06-18 10 views
-5

Gibt es eine Möglichkeit, Map<Long, String> direkt aus einer groupingBy-Funktion in Java 8 zu erstellen, anstatt Map<Long, Set<String>> zu erstellen?Java 8 Stream-Gruppierungby ohne Rückgabe Liste

Ich habe den folgenden Code:

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()))); 

Ich brauche das o/p wie:

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

Liste hat einen einzigen generischen Typ. Liste existiert nicht. Code, der sinnvoll ist, und kompiliert. Beachten Sie auch die grundlegenden Java-Namenskonventionen. Variablen beginnen mit einem Kleinbuchstaben. –

+0

Danke für die Änderung mich, ich ersetzte die Karte nach Liste. bearbeitet und korrigiert die Frage. – Mango

+1

Kompiliert immer noch nicht (add() nimmt ein einzelnes Argument, nicht 3) und beachtet immer noch nicht die Namenskonventionen. Machen Sie einen Schritt zurück, öffnen Sie Ihre IDE, schreiben Sie Code, der in der IDE kompiliert wird, und beheben Sie dann Ihre Frage. –

Antwort

3

Alles, was Sie brauchen, ist toMap(), mit einer Merge-Funktion, die den aktuellen Mitarbeiternamen hält (oder die neue, da sie gleich sein sollten):

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}