【问题标题】:Stream collector error on filtering the custom list过滤自定义列表时出现流收集器错误
【发布时间】:2020-07-21 09:40:02
【问题描述】:
List<RuleData> ruleDataList = conflictRuleIds.stream()
                .filter(conflictRuleId -> idsMap.containsKey(conflictRuleId))
                .collect(Collectors.toList());

这是给我的错误

no instance(s) of type variable(s) exist so that String conforms to RuleData inference variable T has incompatible bounds: equality constraints: RuleData lower bounds: String

价格上,我想做的是过滤掉conflicRuleIds列表,然后检查是否在地图中。最后收集到列表

idsMap 包含 key-&gt;value as [string,RuleData]conflictingRuleIds 是一个字符串列表

对于地图中的每个匹配 Id,我必须在地图中添加相应键的值..类似于 .map() 函数

【问题讨论】:

  • conflictRuleIdsRuleData 是什么?如果它只是 Id(可能是字符串类型)那么你只得到 ids 列表意味着字符串列表
  • RuleData 不是字符串,但conflictingRuleIds 是字符串列表
  • 什么是 idsMap ? id 为ruleData 且值为ruleData 的映射?
  • 你的意思是List&lt;String&gt; ruleDataList

标签: java lambda java-stream collectors


【解决方案1】:

您需要使用map(),通过从idsMap获取将数据从字符串的id转换为RuleData

List<RuleData> ruleDataList = conflictRuleIds.stream()
                .filter(conflictRuleId -> idsMap.containsKey(conflictRuleId))
                .map(conflictRuleId -> idsMap.get(conflictRuleId))
                .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    也许这是一个口味问题,但我会首先迭代映射条目和过滤条目,哪个键存在于列表中,而不是开始迭代列表元素:

    List<RuleData> ruleDataList = idsMap.entrySet().stream()
                    .filter(entry -> conflictRuleIds.contains(entry.getKey()))
                    .map(Map.Entry::getValue)
                    .collect(Collectors.toList());
    

    如果没有其他人反对它,我会使用 Set 代替 conflictRuleIds 而不是 List

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 2021-04-27
      • 2015-07-22
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多