Return 使用 Lightweight-Stream-API 来自可选对象列表的当前对象列表

Return a List of present objects from a List of Optional objects using Lightweight-Stream-API

假设我有一个包含 Optional 个对象的数组列表,例如 List<Visit> visit = {Optional[Visit], Optional[Visit], ...}。我如何从 Optional 中获取 Visit 对象并将这些对象 return 作为 List?

我试过这样的事情:

return Stream.of(visits).filter(value -> Optional.isPresent(value))
    .map((Visit t) -> Optional.get(t))
    .collect(Collectors.toList());

还有这个:

return Stream.of(visits)
   .map(visit -> Optional.of(visit).get())
   .collect(Collectors.toList());

但这不能编译。

我正在尝试使用 Lightweight-Stream-API 作为流库。

你可以这样做:

return visits.stream()
             .map(visit -> visit.orElse(null))
             .filter(Objects::nonNull)
             .collect(Collectors.toList());

假设 visitsList<Optional<Visit>> 类型。

您的代码无法编译的原因

假设变量 visits 的类型为 List<Optional<Visit>> 您发布的语句:

Stream.of(visits).filter(value -> Optional.isPresent(value))
                 .map((Visit t) -> Optional.get(t))
                 .collect(Collectors.toList());

存在以下问题:

  1. Stream.of() 采用类型 T 的一个元素或多个元素并创建一个 Stream。您使用 visits 作为 List<Optional<Visit>> 类型的一个元素,我认为您打算获得 Optional<Visit>Stream,您可以使用 visits.stream().

  2. filter(value -> Optional.isPresent(value)) 确实以静态方式调用 isPresent(T t) 而方法 isPresent(T t) 不存在,既不静态也不作为实例方法。我认为您打算做的是:filter(value -> value.isPresent()) 等于 filter(Optional::isPresent)。第二个的区别是 Optional::isPresent 不调用静态方法而是导致方法引用。

  3. map((Visit) t -> Optional.get(t)) 也以不存在的静态方式调用方法 get(T t),既不静态也不作为实例方法。我认为您打算调用等于 map(Optional::get)map((Visit) t -> t.get())

解决这些问题将产生新声明:

visits.stream().filter(Optional::isPresent)
               .map(Optional::get)
               .collect(Collectors.toList());

与我的解决方案的区别仅在于您在过滤后进行映射。作为 reader 正确的做法,您需要记住 Optional::get 将始终 return 一个 非空 值。如果您先映射然后过滤,您不必记住没有 null 值,因为您在第二步中将它们过滤掉了。

您可以按如下方式进行:

List<Visit> visitsWithoutOptionals = visits.stream()
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());