你可以这样做:
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
值,因为您在第二步中将它们过滤掉。