繁体   English   中英

Java 流比较属性在两个列表之间相等并返回 true 或 false

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM