从 Java / IntelliJ 中的控制台输出中删除 "Optional[...]"

Remove "Optional[...]" from a Console OutPrint in Java / IntelliJ

我正在学习编程,并且在 Java 中从事流媒体方面的工作。我写了一个方法,它应该 return 医生患者列表中最高的人类对象。

public static void tallestPatient(List<Human> patients) throws NullPointerException {
    try {
        System.out.println("Tallest patient: ");
        System.out.print(patients.stream().max(Comparator.comparingInt(Human::getHeight)));
        System.out.println();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

该方法本身有效。我刚刚注意到,每当我尝试打印所选对象(最高的人)的 toString() 方法时,控制台上都会有这个“可选 [...]”标签。

控制台输出:

最高的患者: Optional[Peter为美国私人保险男性,身高约220cm]

IDE 告诉我,那是因为如果它是一个空列表,元素可能为零。试图通过考虑 NullPointerExceptions 以及 if 和 else 条件来取消它,这也没有解决问题,为什么要保留异常变体。

有人知道我可以解决什么问题吗?

你好贾斯汀

聚合函数 Stream::max returns an OptionalOptionaltoString 实现产生了我们观察到的 String

我们可以通过展开 Optional 来防止这种情况发生。一种可能的方法是调用 Optional::orElse:

System.out.print(patients.stream()
  .max(Comparator.comparingInt(Human::getHeight))
  .orElse(null));

另一种可能性是,如果通过 Optional::ifPresent:

存在值,则仅 print
patients.stream()
  .max(Comparator.comparingInt(Human::getHeight))
  .ifPresent(System.out::println)

关于代码的评论:捕捉 NullPointerException 的决定至少是有问题的。我建议明确执行非 null 性。