Фильтрация картына карту - PullRequest
0 голосов
/ 25 марта 2019

У меня есть класс EmpObj, который имеет два параметра Integer Empid и BigDecimal Salary.У меня есть карта со структурой Map<String, List<EmpObj>> map. Я хочу, чтобы мой результат был в формате Map<String, List<Integer>> карта после фильтрации всех сотрудников с зарплатой> 25000. Окончательный список будет содержать Name(String) и Integer(EmpID).

* 1009.* Пока что Мой подход:
public  class EmpObj {
    Integer empid;
    BigDecimal salary;`


    public EmpObj(Integer empid, BigDecimal salary) {
        this.empid = empid;
        this.salary = salary;
    }}

public static void main(String[] args) {
        Map<String, List<EmpObj>> map = new HashMap<>();
        EmpObj e1= new EmpObj(12,new BigDecimal(23000));
        EmpObj e2= new EmpObj(13,new BigDecimal(45000));
        EmpObj e3= new EmpObj(14,new BigDecimal(65000));
        List<EmpObj> o1 = new ArrayList<>();
        o1.add(e1);
        map.put("Vinny",o1);
        List<EmpObj> o2 = new ArrayList<>();
        o2.add(e2);
        map.put("David",o2);
        List<EmpObj> o3 = new ArrayList<>();
        o3.add(e3);
        map.put("Mike",o3);

Мое выражение Java-8:

Map<String,List<EmpObj>> Mp1 =
            map.entrySet().stream()
                .filter(s->//Something Here)
                .collect(Collectors.toMap(Map.Entry::getKey,
                    Map.Entry::getValue));
         Mp1.entrySet().stream().forEach(System.out::println);

Я не получаю Результат, любое предложение ???

Мой вывод должен быть Дэвид = [14], Майк = [13] Моя проблема решена.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Ну, вы не можете сравнить BigDecimal с обычными > и <, что вы можете сделать, это создать переменную BigDecimal compareAgainst = BigDecimal.valueOf(25000L) и использовать ее с оператором фильтра:

...filter(entry -> entry.getValue().getSalary().compareTo(compareAgainst) > 0)

Я дам вам понять, как compareTo работает в этом случае; после фильтрации вам не нужно собирать их обратно в Map просто для печати, например:

.forEach(entry -> System.out.println(entry.getKey() + "  " +  entry.getValue().getEmpid()))

Создание этого решения зависит от вас, поскольку вы сказали, что вы начинающий; это не так сложно в любом случае.

0 голосов
/ 25 марта 2019

Поскольку у вас есть List<EmpObj> в качестве значения карты, вам нужно перейти на 1 уровень вниз до EmpObj, чтобы отфильтровать все зарплаты.В то же время вам все еще нужно сохранить ключ карты, потому что вы хотите напечатать его в конце.

Вы можете использовать flatMap и сохранить ключ и значение в SimpleEntry, например:

Map<String, List<Integer>> collect = map.entrySet().stream()
        .flatMap(entry -> entry.getValue().stream()
                .filter(empObj -> empObj.getSalary().compareTo(new BigDecimal(25000)) > 0)
                .map(empObj -> new AbstractMap.SimpleEntry<>(entry.getKey(), empObj)))
        .collect(groupingBy(Map.Entry::getKey, 
                 mapping(entry -> entry.getValue().getEmpid(), toList())));

System.out.println(collect);
...