gpt4 book ai didi

java - 如何使用流和 1.8 函数连接 2 个列表?

转载 作者:行者123 更新时间:2023-12-03 18:37:07 25 4
gpt4 key购买 nike

我有一个包含价格和价格组的列表

static class PriceGroup {
String priceName;
String priceGroup;
}

static class Price {
String priceName;
Integer price;
}

下面是一些示例数据,以及我编写的用于查找每个 PriceGroup 的最低价格的实现。有什么建议可以重构它以利用流来加入这些数据吗?

List<PriceGroup> priceGroups = Arrays.asList(
new PriceGroup("F1", "Friends"),
new PriceGroup("F2", "Friends"),
new PriceGroup("O1", "Others"),
new PriceGroup("O2", "Others"));

List<Price> prices = Arrays.asList(
new Price("F1", 100),
new Price("F2", 150),
new Price("O1", 250),
new Price("O2", 300));

public Map<String, Integer> getBestPrices(List<PriceGroup> priceGroups, List<Price> prices)
{
Map<String, Integer> bestPrice = new HashMap<String, Integer>();
for (PriceGroup priceGroup : priceGroups) {
if (bestPrice.get(priceGroup.priceGroup) == null) {
bestPrice.put(priceGroup.priceGroup, 10000000);
}

for (Price price : prices) {
if (price.priceName.equals(priceGroup.priceName)) {
bestPrice.put(priceGroup.priceGroup, Math.min(price.price, bestPrice.get(priceGroup.priceGroup)));
}
}
}

return bestPrice;
}

对于给定的数据,我的函数应该返回一个 map :

F1 => 100
O1 => 250

最佳答案

要加入 2 个列表,您可以考虑创建专用对象:

class Joined {
String priceGroup;
String priceName;
Integer price;
...

然后,使用 flatMap,您可以加入 priceGroupspriceName 字段上的 prices 并按 分组价格组:

Map<String, Optional<Joined>> map = priceGroups.stream()
.flatMap(group -> prices.stream()
.filter(p -> p.getPriceName().equals(group.getPriceName()))
.map(p -> new Joined(group.getPriceGroup(), group.getPriceName(), p.getPrice())))
.collect(groupingBy(Joined::getPriceGroup, minBy(Comparator.comparing(Joined::getPrice))));

现在从 map 获取值,您可以打印预期结果:

for (Optional<Joined> value : map.values()) {
value.ifPresent(joined -> System.out.println(joined.getPriceName() + " " + joined.getPrice()));
}

// O1 250
// F1 100

关于java - 如何使用流和 1.8 函数连接 2 个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55045724/

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