我有一个
List<ClassA> listOfClassA;
ClassA包含另一个对象,比如insideObj。我想获取insideObj的第一个实例,该实例为非null,并包含一个字符串的非空字段。目前我正在做
for (ClassA objA : listOfClassA) {
if(objA.getInsideObj() != null && !objA.getInsideObj().getName().isEmpty())
return objA.getInsideObj().getName();
}
在Java 8中,有没有更清洁的方法?
答案 0 :(得分:3)
您可以尝试:
listOfClassA.stream()
.map(ClassA::getInsideObj)
.filter(Objects::nonNull)
.map(ClassB::getName)
.filter(this::isNotEmpty)
.findFirst()
.orElse(null);
boolean isNotEmpty (String s) {
return s != null && !s.isEmpty();
}
答案 1 :(得分:1)
您可以这样做
String firstInsideName = listOfClassA.stream()
.map(ClassA::getInsideObj)
.filter(Objects::nonNull)
.map(InsideObj::getName)
.filter(n -> !n.isEmpty())
.findAny()
.orElse(null);
答案 2 :(得分:0)
Predicate<ObjA> objAfilter = objA -> Objects.nonNull(objA.getInsideObj()) && Objects.nonNull(objA.getInsideObj().getName()) && !objA.getInsideObj().getName().isEmpty();
String firstInsideName = listOfClassA.stream()
.filter(objAfilter)
.map(ClassA::getInsideObj)
.findFirst()
.orElse(null);