2016-06-18 4 views
-5

Есть ли способ создать Map<Long, String> непосредственно из функции groupingBy в Java 8 вместо создания Map<Long, Set<String>>?Java 8 Stream groupingby без возврата Список

У меня есть следующий код:

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

мне нужно о/р, как:

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

Список имеет один общий тип. Список не существует. Почтовый код, который имеет смысл и компилируется. Также, пожалуйста, соблюдайте основные соглашения об именах Java. Переменные начинаются с строчной буквы. –

+0

Спасибо, что изменили меня, я заменил карту по списку. отредактировал и исправил вопрос. – Mango

+1

По-прежнему не компилируется (add() принимает один аргумент, а не 3) и по-прежнему не соблюдает соглашения об именах. Сделайте шаг назад, откройте свою 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} 
Смежные вопросы