可选列表和以下映射

时间:2018-05-28 13:33:20

标签: java performance list lambda optional

我希望你很好。

我遇到了一些涉及列表操作的场景。期望是对该列表进行以下数据映射并避免任何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());
                    }
                }
            }
        }
    }
}

谢谢,

度过愉快的一天。

1 个答案:

答案 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();
}