-1

Optional考虑我有一个对象的数组列表,例如List<Visit> visit = {Optional[Visit], Optional[Visit], ...}. 我如何Visit从 中获取对象Optional并将这些对象返回为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作为流库。

4

2 回答 2

4

你可以这样做:

List<Visit> visitsWithoutOptionals = visits.stream()
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());
于 2017-05-11T15:43:28.127 回答
3

你可以这样做:

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

假设visits是类型List<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>>我认为您打算获得一个StreamOptional<Visit>您可以通过使用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());

我的解决方案的不同之处仅在于您在过滤后进行映射。作为一个正确理解它的读者,你需要记住它Optional::get总是会返回一个非空值。如果您先映射然后过滤,则不必记住没有null值,因为您在第二步中将它们过滤掉。

于 2017-05-11T15:15:04.627 回答