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

Lambda 从列表中获取第一个非空对象、非空字符串字段值,lambda,java-8,functional-programming,Lambda,Java 8,Functional Programming,我有一个 List<ClassA> listOfClassA; 在Java 8中是否有更干净的方法可以做到这一点?您可以尝试: listOfClassA.stream() .map(ClassA::getInsideObj) .filter(Objects::nonNull) .map(ClassB::getName) .filter(this::isNotEmpty) .findFirst() .orElse(null); boolean isNotEm

我有一个

List<ClassA> listOfClassA;
在Java 8中是否有更干净的方法可以做到这一点?

您可以尝试:

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();
}
您可以尝试:

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();
}
你可以这样做

String firstInsideName = listOfClassA.stream()
    .map(ClassA::getInsideObj)
    .filter(Objects::nonNull)
    .map(InsideObj::getName)
    .filter(n -> !n.isEmpty())
    .findAny()
    .orElse(null);
你可以这样做

String firstInsideName = listOfClassA.stream()
    .map(ClassA::getInsideObj)
    .filter(Objects::nonNull)
    .map(InsideObj::getName)
    .filter(n -> !n.isEmpty())
    .findAny()
    .orElse(null);

如果找不到非null的insideObj或具有非空名称字符串的insideObj,该函数会返回null吗?谢谢,但是,当我在代码段之前放置一个返回值时,它表示类型流的方法OrelSelsNull未定义。从技术上讲,我只想返回getName@Saad是你先放的吗?我第一次忘了。对不起,我放了。现在它的给定错误FilterPredicate方法包含一个非空字段,它是一个字符串。。。如果找不到非null的insideObj或具有非空名称字符串的insideObj,则可以使用String::IsEmptyWhat返回null?谢谢,但是,当我在代码段之前放置一个返回时,它表示类型流的方法orElsenull未定义。从技术上讲,我只想返回getName@Saad是你先放的吗?我第一次忘了。对不起,我放了。现在它的给定错误FilterPredicate方法包含一个非空字段,它是一个字符串。。。您可以使用String::isEmpty