java 8嵌套null检查对象列表

时间:2017-05-02 15:40:07

标签: java-8 optional

我正在尝试进行嵌套的空检查,如果地图不为空,则清除嵌套对象中map中的值。

以下是我的假设代码。我想知道这是否是正确的方法,或者是否有更优雅的解决方案。

package exp.myJavaLab.Experiments;

    import java.util.*;

    public class OptionalTest {

        public Inner inner;

        public static void main(String[] args) {

            OptionalTest testObj = new OptionalTest();
            Pojo pojo1 = new Pojo();
            pojo1.id = 1;
            Map<String, String> dataMap = new HashMap<>();
            dataMap.put("a","b");
            pojo1.dataMap = dataMap;
            Pojo pojo2 = new Pojo();
            pojo2.id = 2;

            Inner inner = new Inner();
            inner.pojoList = Arrays.asList(pojo1, pojo2);

            testObj.inner = inner;

            System.out.println(testObj);

            Optional.ofNullable(testObj.inner)
            .map(Inner::getPojoList)
            .ifPresent(pojos -> pojos.forEach(pojo -> {
                    if (pojo.getDataMap() != null) {
                        pojo.getDataMap().clear();
                    }
                }));

            System.out.println(testObj);

        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("OptionalTest{");
            sb.append("inner=").append(inner);
            sb.append('}');
            return sb.toString();
        }
    }

    class Inner {
        public List<Pojo> pojoList;

        public List<Pojo> getPojoList() {
            return pojoList;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Inner{");
            sb.append("pojoList=").append(pojoList);
            sb.append('}');
            return sb.toString();
        }
    }

    class Pojo {

        public Map<String, String> dataMap;
        public int id;

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Pojo{");
            sb.append("dataMap=").append(dataMap);
            sb.append(", id=").append(id);
            sb.append('}');
            return sb.toString();
        }

        public Map<String, String> getDataMap() {
            return dataMap;
        }

        public int getId() {
            return id;
        }
    }

1 个答案:

答案 0 :(得分:0)

在我看来,收藏品永远不会为空。

您可以将pojoListdataMap声明为private并对其进行实例化。 然后你的班级需要一些add - 方法。因此,您确定getDataMap()永远不会返回null

class Pojo {
    private Map<String, String> dataMap = new HashMap<>();

    public Map<String, String> getDataMap() {
        return dataMap;
    }

    public void add(String key, String value) {
        dataMap.put(key, value);
    }
}

然后您不需要检查null

Optional.ofNullable(testObj.inner)
.map(Inner::getPojoList)
.ifPresent(pojos -> pojos.forEach(pojo -> { pojo.getDataMap().clear(); }));