Java泛型不兼容类型(不存在类型变量的实例)

时间:2019-06-26 10:10:45

标签: java generics lambda java-8

问题标题似乎与其他帖子相同,但内容不同。因此,请不要将其标记为重复。

问题

我有以下课程:

public class SCDTO extends RDTO {
    private List<String> sCPairs = Collections.emptyList();

    public SCDTO(List<String> sCPairs) {
        this.sCPairs = sCPairs;
    }

    //Getter setter

}

我正在尝试使用以下lambda表达式来设置sCPairs

sCPairsObject.setSCPairs(util.getSCMap().entrySet().stream().
                        filter(entry -> entry.getValue().contains("abc")).collect(Collectors.toCollection(ArrayList<String>::new)));

但是我遇到一个编译错误:

no instance(s) of type variable(s) exist so that Entry<String, List<String>> conforms to String

util.getSCMap返回Map<String, List<String>>

任何人都可以解释为什么会发生这种情况以及如何解决吗?

谢谢。

4 个答案:

答案 0 :(得分:4)

您的流管道会找到其值Map包含List<String>“ abc”的所有String条目,并尝试将它们收集到List<String>中。

您没有指定打算如何将每个将过滤器传递给Map.Entry<String,List<String>>的{​​{1}}元素进行转换。根据所需的逻辑,也许您错过了过滤器后面的String步骤。

例如,如果您希望收集所有具有将过滤器传递到map()的值的键:

List<String>

答案 1 :(得分:1)

您正在从地图中流式传输条目:

sCPairsObject.setSCPairs(util.getSCMap().entrySet().stream()

然后过滤掉其中一些:

.filter(entry -> entry.getValue().contains("abc"))

现在您需要将条目映射到列表,例如:

.map(entry -> entry.getValue())

并将所有这些列表的内容作为一个流传输:

.flatMap(List::stream)

最后将值收集到列表中:

.collect(Collectors.toList());

答案 2 :(得分:0)

您根本不需要使用密钥,因此不需要遍历tags .GroupBy(t => t.FirstId) .ToDictionary(k => k.Key, g => g.OrderBy(t => t.Sequence).Select(t => t.SecondId)); 。您可以获取entrySet的值并对其进行过滤。看起来像这样

Map

答案 3 :(得分:0)

由于您要将src/main/resources转换为spring.jackson.deserialization.fail-on-unknown-properties=true ,其中列表应该是所有匹配值列表的并集,因此需要Map<String, List<String>>才能将这些值加入流列出到单个流中。

此外,您似乎不需要键,因此只需流式传输地图的值即可:

List<String>