Необязательные списки и последующее сопоставление - PullRequest
0 голосов
/ 28 мая 2018

Надеюсь, у вас все хорошо.

Я столкнулся с некоторыми сценариями, которые включают манипуляции со списком.Ожидалось бы сделать следующее отображение данных этого списка и избежать любого NPE.Это будет сделано с помощью цикла for и внутренних запросов для любых данных, которые могут содержать другой список, и так далее.Что было бы лучшим подходом к манипулированию данными с учетом производительности.Было бы лучше сохранить цикл for или мы могли бы улучшить с помощью опций и лямбда, или, по крайней мере, соответствовать той же производительности?
Например:

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 голосов
/ 28 мая 2018

Это именно то, что вы делаете в своем коде, но используя 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();
}
...