[英]Java streams compare property is equal between two lists and return true or false
class Pair {
String key;
String value;
}
List<Pair> list1 = Stream.of(
new Pair("key1", "value1"),
new Pair("key2", "value2")
)
.collect(Collections.toList());
List<Pair> list2 = Stream.of(
new Pair("key1", "value2"),
new Pair("key2", "value3")
)
.collect(Collections.toList());
我想对list2
中的值进行一些更改,然后将其与list1
进行比较。
我想检查与 list1 相比,列表中所有项目的属性键在 list2 中是否没有更改。 list2 中只能更改 value 属性。
并且 list2 中的项目数与 list1 list1.size() = list2.size() 相同
我正在尝试编写返回 boolean 的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 但在某个地方我一定是弄错了
list1.stream()
.allMatch(pair2-> list2.stream()
.anyMatch(pair->pair.getKey().equals(pair2.getKey())));
// Need to add list size() comparison too
更新:我设法编写了这样的 stream,junit 测试似乎有效,尽管它没有比较与 ernest_k 的答案相同索引的项目。
list1.stream()
.allMatch(pair -> list2.stream()
.anyMatch(pair2-> pair.getKey().equals(pair2.getKey()) ) && list1.size()== list2.size()
));
您可以使用:
boolean result = list1.size() == list2.size() &&
IntStream.range(0, list1.size())
.allMatch(i -> list1.get(i).getKey().equals(list2.get(i).getKey()));
由于您必须逐个元素比较列表元素,因此您不能使用嵌套的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ (就像在您的示例中一样),如果每个list1
元素都有任何list2
元素具有相同的键(而您希望该比较是索引感知的)
您可以构建一个查找表来引用原始密钥。
public static compareStates(List<Pair> original, List<Pair> current){
Map<String,Pair> lookupTable= original.stream.collect(Collectors.toMap(x ->x.key,x->x));
boolean hasElementChanged = current.stream().filter(pair -> !lookupTable.containsKey(pair.key)).count() >0;
boolean hasCountChanged = original.length !=current.length;
return hasCountChanged || hasElementChanged;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.