gpt4 book ai didi

java - 使用新的 Java 8 API 流和 lambda 表达式检查两个集合

转载 作者:行者123 更新时间:2023-11-30 08:15:13 25 4
gpt4 key购买 nike

我有两个集合,它们都由相同类型的对象组成,这种类型的对象有一个字段,在本例中为“codeType”。

我需要检查第二个集合中的所有“代码类型”是否与第一个集合中的相同,没有添加任何额外内容。我可以这样做,只是迭代两个集合以获取 id,然后检查它们。但是因为我们使用的是 Java 8,所以我想使用流和 lambda 来完成它(因为我正在学习它)

到目前为止,这是我所做的:

Boolean collectionEquals = CollectionUtils.isNotEmpty(oldOrderPositions)
? oldOrderPositions.stream()
.mapToLong(oldPosition ->
oldPosition.getCodeType().getId())
.allMatch(newOrderPositions.stream()
.mapToLong(newPosition ->
newPosition.getCodeType().getId()))
: false;

基本上,我得到了两个集合,我遍历它们以获取 ID,然后检查所有 ID 是否匹配。但是,我收到一个编译错误,提示“LongStream 中的 allMatch(java.util.fuction.Predicate) 无法应用于 (java.util.stream.LongStream)”

你能帮帮我吗?我不知道我做错了什么或错过了什么。

谢谢你的时间

最佳答案

其他两个解决方案要么不检查双胞胎,要么不检查顺序。

使用此解决方案,您可以检查所有 id 是否存在,如果有达布隆则不管它们的位置如何:

return Arrays.equals(
oldOrderPositions.stream()
.mapToLong(p -> p.getCodeType().getId())
.sorted()
.toArray(),
newOrderPositions.stream()
.mapToLong(p -> p.getCodeType().getId())
.sorted()
.toArray()
);

当然,您可以重构它,让方法执行转换,但因为我不知道 oldOrderPositionsnewOrderPositions 是否属于同一类型,所以我不知道不要自己做。如果是,就这样做:

static long[] normalize(Collection<OrderPosition> orderPositions) {
return orderPositions.stream()
.mapToLong(p -> p.getCodeType().getId())
.sorted()
.toArray();
}
...
return Arrays.equals(
normalize(oldOrderPositions),
normalize(newOrderPositions)
);

哦,是的,你写道你想使用流来完成它。我不得不说,仅仅因为你有一把锤子,你不会用它把所有东西都放在墙上。有时您需要一把 Screwdriver 。所以这就是这样一个解决方案,针对适当的问题使用适当的工具。流对于部分问题(转换)很有用,但为了进行比较,我建议您使用一些其他的好工具供您使用,因此使用了 Arrays.equals()

关于java - 使用新的 Java 8 API 流和 lambda 表达式检查两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29030251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com