如何从另一个 Supplier 创建一个 Supplier 并过滤掉一些项目?
How to create a Supplier from another Supplier and filter out some items?
假设 Supplier<Optional<Item>>
是来源,Supplier<Item>
是我们想要的:没有 Optional.Empty
个案例的相同项目。
给定 Supplier<Optional<Item>> optSupplier
:
Supplier<Item> itemSupplier = () -> {
Optional<Item> opt = optSupplier.get();
while (!opt.isPresent()) {
opt = optSupplier.get();
}
return opt.get();
};
当您尝试从项目供应商处 get
时,它会一直从可选供应商处拉取数据,直到获得不为空的结果,然后 return 项目。
(警告:如果可选供应商总是 return 是一个空可选,那么项目供应商将陷入无限循环。)
灵感来自 and :
Supplier<Item> filtered = Stream.generate(optSupplier)
.flatMap(Optional::stream)
.iterator()::next;
如果您是 Java 9 之前的人,请将 flatMap
替换为 .filter(Optional::isPresent).map(Optional::get)
。
假设 Supplier<Optional<Item>>
是来源,Supplier<Item>
是我们想要的:没有 Optional.Empty
个案例的相同项目。
给定 Supplier<Optional<Item>> optSupplier
:
Supplier<Item> itemSupplier = () -> {
Optional<Item> opt = optSupplier.get();
while (!opt.isPresent()) {
opt = optSupplier.get();
}
return opt.get();
};
当您尝试从项目供应商处 get
时,它会一直从可选供应商处拉取数据,直到获得不为空的结果,然后 return 项目。
(警告:如果可选供应商总是 return 是一个空可选,那么项目供应商将陷入无限循环。)
灵感来自
Supplier<Item> filtered = Stream.generate(optSupplier)
.flatMap(Optional::stream)
.iterator()::next;
如果您是 Java 9 之前的人,请将 flatMap
替换为 .filter(Optional::isPresent).map(Optional::get)
。