gpt4 book ai didi

java - 在流中使用 Java 8 Supplier 实现惰性求值

转载 作者:行者123 更新时间:2023-11-29 08:26:58 25 4
gpt4 key购买 nike

我正在尝试在这样的流中使用 Supplier 实现惰性评估

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());
}

最佳答案

你的第二个变体可以简化为

List<String> list = getList();
if(!list.isEmpty()) {
list.stream()
.filter(getExpensiveList().get()::contains)
.forEach(System.out::println);
}

它使 Supplier 的使用毫无意义,因为即使对 getExpensiveList() 的调用也只有在列表非空时才会完成。但另一方面,这是你可以得到的最大惰性,即当另一个列表为空时不请求昂贵的列表。在任何一种情况下,当列表不为空时,都会为第一个元素请求昂贵的列表。

如果昂贵的列表会变大,你应该使用

List<String> list = getList();
if(!list.isEmpty()) {
list.stream()
.filter(new HashSet<>(getExpensiveList().get())::contains)
.forEach(System.out::println);
}

相反,避免重复线性搜索。或者重新设计 getExpensiveList() 以首先返回一个 Set

关于java - 在流中使用 Java 8 Supplier 实现惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51941203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com