Фильтровать элемент списка карты, а затем вернуть карту в Java 8+ - PullRequest
0 голосов
/ 19 сентября 2019

Я бы хотел отфильтровать элемент списка карты, а затем вернуть карту в java 8 +

public class Test {
    List<Employee> list1 = new ArrayList<>();
    list1.add(emp1);                   // emp1's  filterEmployee return true    
    list1.add(emp2);                   // emp2's  filterEmployee return true  
    list1.add(emp3);                   // emp3's  filterEmployee return false  

    List<Employee> list2 = new ArrayList<>();
    list2.add(emp4);                    // emp4's  filterEmployee return false        
    list2.add(emp5);                    // emp5's  filterEmployee return true 
    list2.add(emp6);                    // emp6's  filterEmployee return true 

    map.put("Sales", list1);
    map.put("Tech", list2);



    public Map<Department, List<Employee>> getEmployeeByDepartment( Map<Department, List<Employee>> map)
    {
        return map1;
    }   

    static boolean filterEmployee(Employee employee)
    {
        check employee something and filter out based on some critiea
        and return true or false based on that
    }
}

в методе getEmployeeByDepartment, для каждой записи на карте отфильтровать сотрудника в списке значений картыс помощью метода filterEmployee, приведенного ниже, и возвращаемое map1 будет содержать карту так, что

<"Sales", list1.add (emp1)> // фильтр empEmployee emp1 возвращает true

<"Sales", list1.add (emp2)> // фильтр empEmployee emp2 возвращает true

<"Tech", list2.add (emp5)> // filterEmployee emp5 возвращает true

<"Tech", list2.add(emp6)> // empE filterEmployee возвращает true

Я пробовал то и то же, что и ниже, но не сработало

Map<Department, List<Employee>> map2 = map.entrySet().stream().filter(entry -> entry.getValue().stream().filter(Test::filterEmployee).collect(Collectors.toMap((Department)entry.getKey(), (List<Employee>)entry.getValue())));

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Предположим,

Predicate<Employee> test;
Map<Department,List<Employee>> map;

У вас есть несколько вариантов:

Изменение на месте карты:

map.values().forEach(el -> el.removeIf(Predicate.not(test)));

Вставка в новую карту:

Map<Department,List<Employee>> result = new HashMap<>();
map.forEach((d, el) -> result.put(d, el.stream().filter(test).collect(toList()));

Создание с помощью потоковой обработки:

Map<Department,List<Employee>> result = map.keySet().stream()
    .collect(toMap(d -> d, d -> map.get(d).stream().filter(test).collect(toList())));

Существуют и другие варианты, но они являются наиболее очевидными.

1 голос
/ 19 сентября 2019

Примерно так должно работать:

private static boolean shouldKeep(Employee employee) { ... }

// ...

Map<Department, List<Employee>> employees = // a map you've built

// ...

Map<Department, List<Employee>> filteredMap =
                employees.entrySet().stream().collect(
                        Collectors.toMap(
                                e -> e.getKey(),
                                e -> e.getValue().stream()
                                        .filter(employee -> shouldKeep(employee))
                                        .collect(Collectors.toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...