【发布时间】:2019-01-27 04:49:03
【问题描述】:
我正在尝试在这样的流中使用供应商实现惰性评估
public static void main(String[] args) {
Supplier<List<String>> expensiveListSupplier= getExpensiveList();
getList().stream()
.filter(s -> expensiveListSupplier.get().contains(s))
.forEach(System.out::println);
}
private static Supplier<List<String>> getExpensiveList() {
return () -> Stream
.of("1", "2", "3")
.peek(System.out::println)
.collect(Collectors.toList());
}
private static List<String> getList() {
return Stream.of("2", "3")
.collect(Collectors.toList());
}
但这会为列表中的每个元素调用 getExpensiveList() 方法。 我尽量不冗长,也不想写这样的东西,即添加不空的支票和东西。
public static void main(String[] args) {
Supplier<List<String>> expensiveListSupplier = getExpensiveList();
List<String> list = getList();
if (!list.isEmpty()) {
List<String> expensiveList = expensiveListSupplier.get();
list.stream()
.filter(expensiveList::contains)
.forEach(System.out::println);
}
}
private static Supplier<List<String>> getExpensiveList() {
return () -> Stream
.of("1", "2", "3")
.peek(System.out::println)
.collect(Collectors.toList());
}
private static List<String> getList() {
return Stream.of("2", "3")
.collect(Collectors.toList());
}
【问题讨论】:
-
您的问题到底是什么?你能简化一下.. 我尽量不冗长,不想写这样的东西,即添加不空的检查和东西?
-
你可以打电话给
Set<String> expensiveStuff = new HashSet<>(getExpensiveList().get());。使用一个集合可以扩大到任何实际大小并具有恒定的运行时间。 -
一个小提示:供应商实例在被使用后,防止它被垃圾收集和并行执行流,你可以检查这个链接logicbig.com/tutorials/core-java-tutorial/java-util-stream/…@Hoopje 指出更好地使用你的详细信息代码。
-
在这里使用
Supplier有什么意义?您需要已经获取第一个元素的列表,因此与代码的复杂性相比,惰性很小。
标签: java java-8 java-stream lazy-evaluation