遍历对象列表,获取属性的最佳方法

时间:2019-11-19 00:02:39

标签: java spring-boot

如果存在某些属性值,从现有对象列表创建新属性列表的最佳方法是什么?我应该将列表转换为地图吗?但是然后,我希望列表属性成为Map键,但我不知道如何获取这些属性。

我应该只遍历此列表,并且如果列表中的一个属性具有值,则将该属性添加到新列表中,或者是否有更快或更佳的方法来实现我想要的目标?

我需要这个新列表来创建带有动态标题的表。

List<CommissionSchedule> commissionSched = commissionScheduleRepository.findByCarrier(carrier);
     
List <String> hs= new ArrayList<>();
for (CommissionSchedule cs: commissionSched){
    if (cs.getCategory()!=null){
        hs.add("Category");
    } else if (cs.getAutoNew()!null){
       hs.add("Auto New");
    }
    //...etc

}

这不仅仅是为每个属性进行一堆if / else if案例吗?

2 个答案:

答案 0 :(得分:1)

为什么不在CommissionSchedule类中添加评估者?

String getHs(){
    return  category !=null ?  "Category":
            autoNew !=null ? "Auto New" :
            "others" ; 
}

然后在循环中,只需调用getHs()方法

使用流将是这样的。

List<CommissionSchedule> commissionSched = 
    commissionScheduleRepository.findByCarrier(carrier);

List<String> hs = commisionSched.stream()
                        .map(cs -> cs.getHs())
                        .collect(Collectors.toList());

或者,您可以这样做

List <String> hs= new ArrayList<>();
for (CommissionSchedule cs: commissionSched){
    hs.add(cs.getHs());  
}

答案 1 :(得分:0)

您可以像使用Java Reflection API:

    UnaryOperator<String> capitalize = s -> s.substring(0, 1).toUpperCase() + s.substring(1);
    for (Field att : CommissionSchedule .class.getDeclaredFields()) {
        Method getter = CommissionSchedule .class.getDeclaredMethod(String.format("get%s", capitalize.apply(att.getName())));
        if (getter.invoke(b1) != null) {
            hs.add(att.getName());
        }
    }
}

如果您的班级是Bean,则此选项可用。您可以使用实用程序API来操纵BeanUtils之类的bean。