【问题标题】:Java 8 Hashmap | Lombok @Data | Method not readable in Collectors.groupingBy | Composite KeyJava 8 哈希图 |龙目岛@Data | Collectors.groupingBy 中的方法不可读 |复合键
【发布时间】:2020-10-14 07:53:05
【问题描述】:

以下是正在使用的具有 lombok @Data 注释的 bean:

@Data
public class XxedgeCrtV implements Serializable {
    
    private static final long serialVersionUID = 1L;

    private String registryId;
    private String personPartyId; 
    private String source;
    
    private String compositeKey() {
        return registryId + personPartyId + source;
    }
}

当我尝试在复合键上使用 Java 8 创建 hashmap 时,它不会读取该方法:

Set<String> duplicates  = xxedgeCrtVList.stream()
    .collect(Collectors.groupingBy(XxedgeCrtV::compositeKey, Collectors.counting()))
    .entrySet().stream()
                .filter(e -> e.getValue() > 1L)
                .map(e -> e.getKey())
                .collect(Collectors.toSet());

谁能建议如何让代码读取这个方法?

我正在制作复合键的键,因为我必须在列表中搜索重复项。

【问题讨论】:

  • 因为它是private,如果你想从另一个类调用它,就让它成为public
  • 我尝试在复合键上使用 Java 8 创建 hashmap,共享的代码不涉及Map!顺便说一句,您也不能在 Set 中收集重复项。

标签: java java-8 java-stream lombok collectors


【解决方案1】:

方法参考和Lombok插件都没有错误。分组的返回类型是Map

Map<String, Long> duplicates  = xxedgeCrtVList.stream()
    .collect(Collectors.groupingBy(XxedgeCrtV::compositeKey, Collectors.counting()));

使用此代码,我不会收到编译错误。

我打赌这是应该抱怨返回类型而不是方法引用的 IDE 问题。如果是这样,可能还有不同的问题:

  • XxedgeCrtV 如果内部应为static
  • 如果 XxedgeCrtV 位于不同的文件中,compositeKey 的可见性不应为 private

【讨论】:

  • 你确定,你明白这个问题吗?还是只是试图解决 OP 可能面临的任何问题?在这种情况下,人们宁愿投票关闭,因为不清楚或错字..不是吗?例如甚至不知道为什么那张地图现在会被命名为duplicates
  • 我回答了“如何让代码读取此方法”的问题(它本身并不清楚,但可以推断出编译器对该方法的抱怨)并解决了可能出现的问题,其中没有一个是错字: private vs public/protected"package-friendly" 或静态 vs. 非静态,Map vs Set。其次,OP说明了他所做的事情,但似乎有问题而不是编译问题而不是获取它的方式。我相信只要 OP 了解了分组的返回类型和编译问题,他就能够实现他的目标(我认为“如何获取重复项”毫无疑问)。
  • ... 继续:此外,可以使用与Collectors.counting() 下游收集器进行分组来明确地找到重复项,该结果将进一步过滤大于 1 的值。如果我弄错了,请纠正我。跨度>
  • 其实应该去掉compositeKey这个方法。对于复合键,字符串连接是最糟糕的方法。这是不可靠的,因为"ab" + "c" 会与"a" + "bc" 发生冲突,而且价格昂贵。如果不想实现专用键类型,可以使用Arrays.asList(registryId, personPartyId, source),但在这里,XxedgeCrtV 已经是专用复合键类型,得到正确的 equalshashCode 通过 @Data 注释从 Lombok 实现。所以只需使用Function.identity() 作为键功能并获得Map&lt;XxedgeCrtV, Long&gt;...
  • ... 或者您可以在复合键中的字符串之间使用分隔符(例如-_),这些字符串中的任何一个都不会出现。字符串连接本身是一个不同的问题。答案不是为了解决这些问题,而是让代码以正确的返回类型编译并帮助找到编译问题的根源,no 逻辑本身(字符串连接,hashcode/等于)。我相信这些应该在问题下方的评论中指出,并且链接到我的答案...
猜你喜欢
  • 2012-07-26
  • 2017-03-22
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2019-02-14
  • 2019-09-27
  • 1970-01-01
相关资源
最近更新 更多