从列表中获取第一个非空对象,非空字符串字段值

时间:2019-01-20 02:44:32

标签: lambda java-8 functional-programming

我有一个

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中,有没有更清洁的方法?

3 个答案:

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