【问题标题】:Map<String, Object> from List<Object> with setting attribute of object来自 List<Object> 的 Map<String, Object> 与对象的设置属性
【发布时间】:2019-08-30 12:56:00
【问题描述】:

我有一个List&lt;Item&gt; ItemListList&lt;String&gt; selectedItemList

Item : {id:String, name:string, isSelected:Boolean}

我想将 ItemList 转换为 Map&lt;String,Item&gt;,其中 isSelected = true 或 false(条件:selectedItemList.contains(ItemList[n]))。 key 是 Item 的 id。

我试试这个:

Map<String, Item> result = itemList.stream()
    .collect(Collectors.toMap(Item::getId, value -> itemSelectedList.contains(value.getName())));

我的期望:

0 : {0,"item1", true}, 1 : {1,"item1", true} , 2 : {2,"item1", false}...

【问题讨论】:

  • 你的尝试有什么问题?
  • 逻辑错误。我不知道如何获得我想要的值(我不知道如何在流中使用条件,toMap...)
  • A Map 将键与值相关联,在您的情况下,您将键声明为String,将值声明为Item。无论您的0 : {0,"item1", true}, 1 : {1,"item1", true} , 2 : {2,"item1", false} 应该代表哪种数据结构,它都不是Map

标签: java java-8 java-stream


【解决方案1】:

这里的值是布尔值,而不是项目。 您应该先过滤您的列表,然后创建您的地图,如下所示:

Map<String, Item> result = itemList.stream()
    .filter(item -> itemSelectedList.contains(item.getName()))
    .collect(Collectors.toMap(Item::getId, value -> value));

编辑:给定您的编辑,您不想过滤而是评估 isSelected 属性,您可以使用构造函数然后:

Map<String, Campaign> result = itemList.stream()
    .collect(Collectors.toMap(Item::getId, value -> new Item(value.getId(), value.getName(), itemSelectedList.contains(value.getName())));

【讨论】:

  • 但是使用这个解决方案我会丢失未选择的项目。我想保留所有项目(选中或未选中),我必须只更改属性“isSelected”。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2021-04-29
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多