如果存在某些属性值,从现有对象列表创建新属性列表的最佳方法是什么?我应该将列表转换为地图吗?但是然后,我希望列表属性成为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案例吗?
答案 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。