Получить первый ненулевой объект, непустое значение строкового поля из списка - PullRequest
0 голосов
/ 20 января 2019

У меня есть

List<ClassA> listOfClassA;

ClassA содержит еще один объект, скажем, insideObj.Я хочу получить первый экземпляр insideObj, который не является нулевым, и содержит непустое поле, которое является строкой.В настоящее время я делаю

for (ClassA objA : listOfClassA) {
        if(objA.getInsideObj() != null && !objA.getInsideObj().getName().isEmpty())
            return objA.getInsideObj().getName();
    }

Есть ли более чистый способ сделать это в Java 8?

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Вы можете сделать это так,

String firstInsideName = listOfClassA.stream()
    .map(ClassA::getInsideObj)
    .filter(Objects::nonNull)
    .map(InsideObj::getName)
    .filter(n -> !n.isEmpty())
    .findAny()
    .orElse(null);
0 голосов
/ 21 января 2019
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);
0 голосов
/ 20 января 2019

Вы можете попробовать:

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