Java 8 Hashmap | Lombok@Data |方法在收集器中不可读。groupingBy |复合键

Java 8 Hashmap | Lombok@Data |方法在收集器中不可读。groupingBy |复合键,java,java-8,java-stream,lombok,collectors,Java,Java 8,Java Stream,Lombok,Collectors,下面是一个使用中的bean,它具有lombok@Data注释: @Data public class XxedgeCrtV implements Serializable { private static final long serialVersionUID = 1L; private String registryId; private String personPartyId; private String source; p

下面是一个使用中的bean,它具有lombok
@Data
注释:

@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());
Set duplicates=xxedgectrvlist.stream()
.collect(Collectors.groupingBy(XxedgeCrtV::compositeKey,Collectors.counting()))
.entrySet().stream()
.filter(e->e.getValue()>1L)
.map(e->e.getKey())
.collect(收集器.toSet());
有人能建议如何让代码读取此方法吗


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

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

Map<String, Long> duplicates  = xxedgeCrtVList.stream()
    .collect(Collectors.groupingBy(XxedgeCrtV::compositeKey, Collectors.counting()));
Map duplicates=xxedgectrvlist.stream()
.collect(Collectors.groupingBy(XxedgeCrtV::compositeKey,Collectors.counting());
使用这段代码,我没有得到编译错误

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

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

因为它是
私有的
将其设置为
公共的
如果您想从另一个classI调用它,我尝试在复合密钥上使用Java 8创建hashmap,共享的代码不涉及
映射
!顺便说一句,你也不能在
集合中收集重复项。你确定你理解这个问题了吗?还是仅仅是试图解决OP可能面临的任何问题?在这种情况下,人们宁愿投票以不清楚或拼写错误的方式结束。。不是吗?e、 人们甚至不知道为什么那张地图现在会被命名为“重复的”
!我通过解决可能出现的问题来回答“如何让代码读取此方法”(本身不清楚,但可以扣除编译器对该方法的抱怨),其中没有一个是打字错误:
private
vs
public
/
protected
“包友好型”或静态vs.non-static,
Map
vs
Set
。第二,OP陈述了他所做的事情,但似乎在编译方面存在问题,而不是如何获得它。我相信只要OP了解分组的返回类型和编译问题,他就能够实现他的目标(我看不出“如何获得副本”这一问题)。。。。继续:此外,通过使用
collector.counting()
down collector对结果进行进一步筛选,以获得大于1的值,可以通过分组找到重复项。如果我弄错了,请有人纠正我。实际上,应该删除
compositeKey
方法。对于复合键,字符串串联是最糟糕的方法。这是不可靠的,因为
“ab”+“c”
会与
“a”+“bc”
冲突,而且价格昂贵。如果不想实现专用密钥类型,可以使用
Arrays.asList(registryId,personPartyId,source)
,但是在这里,类
XxedgeCrtV
已经是一个专用的复合密钥类型,通过
@Data
注释从Lombok获得正确的
等于
hashCode
实现。所以只需使用
Function.identity()
作为键函数,并获得一个
Map
…。。。或者,您可以在组合键中的字符串之间使用分隔符(例如,
-
-
),这些字符串中的任何一个都不会出现分隔符。字符串连接本身是另一个问题。答案并不是要解决这些问题,而是让代码以正确的返回类型编译,并帮助找到编译问题的根源,而不是逻辑本身(字符串concatation、hashcode/equals)。我相信这些应该在问题下方的评论中指出,而不是与我的答案联系起来。。。