你可以这样做:
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());
有以下问题:
Stream.of()接受一个元素或多个元素类型T并创建一个Stream。您visits用作类型的一个元素,List<Optional<Visit>>我认为您打算获得一个Stream,Optional<Visit>您可以通过使用visits.stream().
filter(value -> Optional.isPresent(value))确实以静态方式调用isPresent(T t),而该方法isPresent(T t)不存在,既不是静态的也不是作为实例方法。我认为您打算做的是:filter(value -> value.isPresent())等于filter(Optional::isPresent). 第二种的不同之处在于Optional::isPresent它不调用静态方法而是导致方法引用。
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值,因为您在第二步中将它们过滤掉。