在地图上进行流和过滤操作

时间:2017-12-06 05:43:36

标签: filter java-8 java-stream

我有一个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)));

我得到的非静态方法无法从静态上下文中引用。我如何实现这一目标?

感谢您的时间

2 个答案:

答案 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