我有一个EdmPortfolio类型,它有id(int),name(String)和标签,这是一个map作为其成员。
EdmPortfolio说有一个id 1,名称为Portfolio1和Map可以有以下值, 分析师,约翰 地区,美国
我有一个列表,最后我希望有一个地图,其中包含所有投资组合中的所有地图值。另一个EdmPortfolio的ID可能为2,名称为Portfolio2,Map为值分析师Smith 地区,英国
我希望将Map与值结合使用 地区'美国','英国' 分析师'约翰','史密斯'
分析师和地区是地图的关键。 它有两个地图相结合。我有以下代码,但我有点失落
List<Map<Tag,String>> portfolioTagsList = new ArrayList<>();
for (EdmPortfolio edmPortfolio : edmPortfolioList) {
Map<Tag,String> portfolioTags = edmPortfolio.getPortfolioTags().entrySet()
.stream()
.filter(e -> (e.getValue() != ""|| e.getValue() !=null))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));
portfolioTagsList.add(portfolioTags);
}
Map<Tag,String> finalTags = portfolioTagsList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.joining(",",Map.Entry::getValue)));
我得到的非静态方法无法从静态上下文中引用。我如何实现这一目标?
感谢您的时间
答案 0 :(得分:4)
我会做类似的事情:
Map<Tag,String> finalTags = edmPortfolioList.stream()
.flatMap(edmPortfolio -> edmPortfolio.getPortfolioTags().entrySet().stream())
.filter(e -> (e.getValue() != "" || e.getValue() !=null)) // this seems weird, but just keeping
.collect(Collectors.groupingBy(e -> e.getKey(),
Collectors.mapping(ev -> ev.getValue(),
Collectors.joining(",")));
BTW:有什么理由在两个流中打破这个?
答案 1 :(得分:4)
不幸的是,“非静态方法无法从静态上下文引用”是类型推断失败时javac
经常出现的错误,尤其是在方法引用或lambda表达式的上下文中。实际原因可能是错误的泛型类型参数,遗忘的import
语句,在不适当的地方使用lambda表达式或方法引用,甚至是某处错位或遗忘的括号。
在您的情况下,它是Collectors.joining(",",Map.Entry::getValue)
,因为该收集器没有可以接受方法引用的函数类型的参数。
您应该使用Collectors.mapping(Map.Entry::getValue, Collectors.joining(","))
代替。
除此之外,请按照BrunoJCM’s suggestion使用单个流操作并注意过滤条件。 e.getValue() != "" || e.getValue() !=null
没有任何意义,因为引用永远不能同时为""
和null
引用,因此,这个条件总是得到满足。您很可能想表示字符串不能是null
而不是空字符串。在这方面,您不应该通过引用比较字符串,而是使用equals
。要测试空字符串,可以使用isEmpty()
代替equals("")
。所以条件应该是e.getValue()!=null && !e.getValue().isEmpty()
。请注意订单,因为我们只有在确认它不是isEmpty()
之后才能调用null
。