将Map <string,list <object >>过滤到Map <string,integer>

时间:2019-03-25 10:41:20

标签: java java-8 java-stream

我有一个类EmpObj,它有两个参数Integer EmpidBigDecimal Salary。 我有一个结构为Map<String, List<EmpObj>> map的地图 我希望我的结果在过滤所有薪水> 25000的员工后以格式Map<String, List<Integer>>映射。最终列表将包含Name(String)Integer(EmpID)

到目前为止,我的方法:

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

我没有得到结果,没有任何建议?

我的输出需要为 David = [14],Mike = [13] 我的问题解决了。

2 个答案:

答案 0 :(得分:0)

由于您将List<EmpObj>作为地图值,因此需要下移一级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);

答案 1 :(得分:0)

好吧,您无法将BigDecimal与通常的><进行比较,您可以做的是创建变量BigDecimal compareAgainst = BigDecimal.valueOf(25000L)并将其与filter语句一起使用:

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

在这种情况下,我将让您了解compareTo的工作方式;过滤后,您无需将它们收集回Map即可进行打印,例如:

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

构建此解决方案完全取决于您,因为您说过自己是一个入门者。反正不是那么复杂。