使用 Lightweight-Stream-API 从可选对象列表中返回当前对象的列表

iro*_*xxx -1 java android lightweight-stream-api

考虑我有一个Optional对象的数组列表,例如List<Visit> visit = {Optional[Visit], Optional[Visit], ...}. 我如何Visit从 获取对象Optional并将这些对象作为 a 返回List

我尝试过这样的事情:

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

和这个:

return Stream.of(visits)
   .map(visit -> Optional.of(visit).get())
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这不能编译。

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

Har*_*ezz 5

你可以这样做:

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

假设visits类型为List<Optional<Visit>>.

代码无法编译的原因

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

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

存在以下问题:

  1. Stream.of()接受一个或多个类型元素T并创建一个Stream。您将visits其用作 type 的一个元素List<Optional<Visit>>,我认为您打算获得一个StreamOptional<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((Visit) t -> t.get())which is equal to map(Optional::get)

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

visits.stream().filter(Optional::isPresent)
               .map(Optional::get)
               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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