gpt4 book ai didi

java - 如何将 pojo id 的映射收集到 pojo 上集合的一组属性

转载 作者:行者123 更新时间:2023-12-01 14:16:27 26 4
gpt4 key购买 nike

我正在尝试使用流将 pojo 映射到 pojo 上的属性公开的一组项目。我意识到这还不清楚,所以我将展示我是如何在没有流的情况下完成的。
我有产品类别的枚举,产品的枚举和具有此类产品的商店列表

public enum Category {
FRUIT, VEGITABLE, MEAT;
}

public enum Product {
APPLE ( Category.FRUIT ),
PEAR ( Category.FRUIT ),
BANANA ( Category.FRUIT ),
CARROT ( Category.VEGITABLE ),
POTATO ( Category.VEGITABLE ),
CABBAGE ( Category.VEGITABLE ),
MINCE ( Category.MEAT ),
CHOP ( Category.MEAT ),
STEAK ( Category.MEAT );

private final Category category;

Product( Category category ) {
this.category = category;
}

public String value() {
return name();
}

public static Product fromValue( String v ) {
return valueOf( v );
}

public Category getCategory() {
return this.category;
}
}

public class Shop {

private long id;
private String name;
private EnumSet<Product> products;

public Shop( long id, String name, Collection<Product> products ) {
this.id = id;
this.name = name;
this.products = ofNullable( products ).map( EnumSet::copyOf ).orElse( null );
}
}
我制作了一种创建一些虚拟数据的方法......
public static List<Shop> getListOfShops() {
Shop shop1 = new Shop( 1, "Green Grocer", EnumSet.of( Product.APPLE, Product.BANANA, Product.CARROT, Product.CABBAGE ) );
Shop shop2 = new Shop( 2, "Supermarket", EnumSet.of( Product.APPLE, Product.BANANA
, Product.CARROT, Product.CABBAGE, Product.CHOP, Product.MINCE ) );
Shop shop3 = new Shop( 3, "Butcher", EnumSet.of( Product.STEAK ) );

return Arrays.asList( shop1, shop2, shop3 );
}
我想创建商店类别的 map
Map<String, EnumSet<Category>> shopCategories = new HashMap<>();
会有这样的内容

{Butcher=[MEAT], Supermarket=[FRUIT, VEGITABLE, MEAT], GreenGrocer=[FRUIT, VEGITABLE]}


我通过一些基本循环实现了这一点,我希望我足够聪明,可以转换成流
public static Map<String, EnumSet<Category>> getCategories( List<Shop> shops ) {

Map<String, EnumSet<Category>> shopCategories = new HashMap<>();

for ( Shop s : shops ) {
Set<Category> cats = new HashSet<Category>();
for ( Product p : s.getProducts() ) {
cats.add( p.getCategory() );
}
shopCategories.put ( s.getName(), EnumSet.copyOf (cats) );
}

return shopCategories;
}
我有一个模糊的想法,如何将其转换为商店 map 以收集器作为终端操作的产品。类似的东西
shops.stream().collect( Collectors.toMap ( s -> s::getName ,
PaymentProductWithCapabilities::getProducts ) );
我正在努力寻找一个了解如何继续映射类别的切入点?谁能指出我正确的方向?

最佳答案

您可以将您正在流式传输的商店的产品转换为预期 Map 的值使用 valueMapperCollectors.toMap ,类似于您的迭代样式:

return shops.stream()
.collect(Collectors.toMap(Shop::getName,
s -> EnumSet.copyOf(s.getProducts().stream()
.map(Product::getCategory)
.collect(Collectors.toSet()))));
准确地说,您的实现会覆盖 Map 的值。 , 如果相同 name可在 Collectors.toMap 中找到两家商店。可以通过 (a,b) -> b等合并功能实现.
或更好的建议 Genecomments :
return shops.stream()
.collect(Collectors.toMap(Shop::getName,
s -> s.getProducts().stream()
.map(Product::getCategory)
.collect(Collectors.toCollection(
() -> EnumSet.noneOf(Category.class))),
(a, b) -> b));

关于java - 如何将 pojo id 的映射收集到 pojo 上集合的一组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63305418/

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