gpt4 book ai didi

java-8 - 谓词如何在 Java 8 中维护状态

转载 作者:行者123 更新时间:2023-12-04 13:25:43 26 4
gpt4 key购买 nike

我在看这个code并试图理解以下代码。
复制自 Stuart Marks 的答案

public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

BigDecimal totalShare = orders.stream()
.filter(distinctByKey(o -> o.getCompany().getId()))
.map(Order::getShare)
.reduce(BigDecimal.ZERO, BigDecimal::add);
我的问题是每次 distinctByKey 将被调用并产生新的 ConcurrentHashMap .它是如何使用 来维护状态的新的 ConcurrentHashMap<>(); ?

最佳答案

由于这是一个捕获 lambda,因此确实是一个新的 Predicate每次调用 distinctByKey 时都会返回实例。 ;但这将在整个流中发生,而不是每个单独的元素。
如果您愿意运行您的示例:Djdk.internal.lambda.dumpProxyClasses=/Your/Path/Here你会看到一个 class为您的实现生成 Predicate .因为这是一个有状态的 lambda - 它捕获了 CHMFunction ,它将有一个 private构造函数和 static factory method返回一个实例。

每次来电distinctByKey将产生一个不同的实例,但该实例将被 Stream 的每个元素重用。如果你运行这个例子,事情可能会更明显一些:

 public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
Predicate<T> predicate = t -> {
Object obj = keyExtractor.apply(t);
System.out.println("stream element : " + obj);
return seen.putIfAbsent(obj, Boolean.TRUE) == null;
};

System.out.println("Predicate with hash :" + predicate.hashCode());
return predicate;
}

@Getter
@AllArgsConstructor
static class User {
private final String name;
}

public static void main(String[] args) {
Stream.of(new User("a"), new User("b"))
.filter(distinctByKey(User::getName))
.collect(Collectors.toList());

}
这将输出:
Predicate with hash :1259475182
stream element : a
stream element : b
Predicate对于 Stream 的两个元素。
如果再添加一个 filter :
Stream.of(new User("a"), new User("b"))
.filter(distinctByKey(User::getName))
.filter(distinctByKey(User::getName))
.collect(Collectors.toList());
会有两个 Predicate s:
Predicate with hash :1259475182
Predicate with hash :1072591677
stream element : a
stream element : a
stream element : b
stream element : b

关于java-8 - 谓词如何在 Java 8 中维护状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387475/

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