Return 使用 Lightweight-Stream-API 来自可选对象列表的当前对象列表
Return a List of present objects from a List of Optional objects using Lightweight-Stream-API
假设我有一个包含 Optional
个对象的数组列表,例如 List<Visit> visit = {Optional[Visit], Optional[Visit], ...}
。我如何从 Optional
中获取 Visit
对象并将这些对象 return 作为 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 作为流库。
你可以这样做:
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>>
类型的一个元素,我认为您打算获得 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(Optional::get)
的 map((Visit) t -> t.get())
。
解决这些问题将产生新声明:
visits.stream().filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
与我的解决方案的区别仅在于您在过滤后进行映射。作为 reader 正确的做法,您需要记住 Optional::get
将始终 return 一个 非空 值。如果您先映射然后过滤,您不必记住没有 null
值,因为您在第二步中将它们过滤掉了。
您可以按如下方式进行:
List<Visit> visitsWithoutOptionals = visits.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
假设我有一个包含 Optional
个对象的数组列表,例如 List<Visit> visit = {Optional[Visit], Optional[Visit], ...}
。我如何从 Optional
中获取 Visit
对象并将这些对象 return 作为 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 作为流库。
你可以这样做:
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>>
类型的一个元素,我认为您打算获得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(Optional::get)
的map((Visit) t -> t.get())
。
解决这些问题将产生新声明:
visits.stream().filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
与我的解决方案的区别仅在于您在过滤后进行映射。作为 reader 正确的做法,您需要记住 Optional::get
将始终 return 一个 非空 值。如果您先映射然后过滤,您不必记住没有 null
值,因为您在第二步中将它们过滤掉了。
您可以按如下方式进行:
List<Visit> visitsWithoutOptionals = visits.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());