Java 8 Hashmap | Lombok@Data |方法在收集器中不可读。groupingBy |复合键
下面是一个使用中的bean,它具有lombokJava 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
@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
vspublic
/protected
“包友好型”或静态vs.non-static,Map
vsSet
。第二,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)。我相信这些应该在问题下方的评论中指出,而不是与我的答案联系起来。。。