gpt4 book ai didi

java - 基于不同的和第二个谓词的过滤器列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:18 25 4
gpt4 key购买 nike

我的对象如下所示

Store {
String shopId;
long distance;
}

我有一个商店列表。

List<Store> storesList = Arrays.asList(
new Store (1, 1),
new Store (1, 5),
new Store (2, 2),
new Store (1, 1), // this is duplicate
new Store (1, 2),
new Store (1, 1), // this is duplicate
new Store (3, 7)
new Store (3, 5)
);

输出

Store {shopId=1, distance=1}  // its fine to have any one among 3 duplicates
Store {shopId=2, distance=2}
Store {shopId=3, distance=5}

我可以像下面这样调用我自己的不同方法

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

然后像这样过滤

List<Store> stores= storesList .stream()
.filter(distinctByKey(pr -> Arrays.asList(pr.getShopId())))
.collect(toList());

但是如何同时通过更小的距离过滤它呢?

最佳答案

 storesList.stream()
.collect(Collectors.toMap(
Store::getShopId,
Function.identity(),
BinaryOperator.minBy(Comparator.comparingLong(Store::getDistance))
))
.values()
.forEach(System.out::println);

您可以合并这些相同的 Store(通过 storeId),您会说在合并时您将采用最小的 distance两个商店。

关于java - 基于不同的和第二个谓词的过滤器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609436/

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