我希望你很好。
我遇到了一些涉及列表操作的场景。期望是对该列表进行以下数据映射并避免任何NPE。这将通过for循环和内部查询任何数据来完成,这些数据可能包含另一个列表,依此类推。考虑到性能,操作数据的最佳方法是什么。维持for循环还是更好,或者我们可以用optionals和lambda改进,或者至少匹配相同的性能? 例如:
class MyObject {
//Constructors
private int id;
private List<MySecondObject> objList;
private String data;
//getters, setters
}
class MySecondObject {
//Constructors
private int id;
private String desc;
//getters, setters
}
public class MyClass {
public static void main(String args[]) {
List<MyObject> objList = getList();
List<String> descList = new ArrayList<>();
if(objList == null){
return;
}
for(MyObject o : objList) {
if(o.getData() == null || o.getData().isEmpty()){
continue;
}
if(o.getObjList() != null) {
for(MySecondObject s : o.getObjList()) {
if(s.getDesc() != null && !s.getDesc().isEmpty()) {
descList.add(s.getDesc());
}
}
}
}
}
}
谢谢,
度过愉快的一天。
答案 0 :(得分:1)
这正是您在代码中所做的,但使用 Streams :
public static List<String> createDescList(List<MyObject> objList) {
return Optional.ofNullable(objList).orElse(Collections.emptyList()).stream()
.filter(Objects::nonNull)
.filter(obj -> isNotEmpty(obj.getData()))
.map(MyObject::getObjList)
.flatMap(List::stream)
.filter(Objects::nonNull)
.filter(obj -> isNotEmpty(obj.getDesc()))
.map(MySecondObject::getDesc)
.collect(Collectors.toList());
}
// TODO can be replaced with org.apache.commons.lang3.StringUtils.isNotEmpty() or isNotBlank()
private static boolean isNotEmpty(String str) {
return str != null && !str.isEmpty();
}