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作为流库。
你可以这样做:
return visits.stream()
.map(visit -> visit.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
假设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());
Run Code Online (Sandbox Code Playgroud)
存在以下问题:
Stream.of()接受一个或多个类型元素T并创建一个Stream。您将visits其用作 type 的一个元素List<Optional<Visit>>,我认为您打算获得一个Stream,Optional<Visit>您可以通过使用 来实现该 Stream 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());
Run Code Online (Sandbox Code Playgroud)
与我的解决方案的区别仅在于您在过滤器之后进行映射。作为正确理解的读者,您需要记住,它将Optional::get始终返回非空值。如果您先映射然后过滤,您不必记住没有null值,因为您在第二步中将它们过滤掉。
| 归档时间: |
|
| 查看次数: |
2645 次 |
| 最近记录: |