有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java streams compare属性在两个列表之间相等,并返回true或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进行比较

我想检查与列表1相比,列表2中所有项目的属性键是否都没有改变。在列表2中只能更改value属性

列表2中的项目数与列表1中的项目数相同。size()=list2。大小()

我试图编写一个返回布尔值的流,但肯定是我弄错了

list1.stream()
    .allMatch(pair2->  list2.stream()
        .anyMatch(pair->pair.getKey().equals(pair2.getKey())));
    // Need to add list size() comparison too

更新: 我成功地编写了一个这样的流,junit测试似乎可以工作,尽管它不比较与ernest_k的答案相同索引的项

   list1.stream()
        .allMatch(pair -> list2.stream()
            .anyMatch(pair2-> pair.getKey().equals(pair2.getKey()) ) && list1.size()== list2.size()
            ));


共 (2) 个答案

  1. # 1 楼答案

    您可以构造一个查找表来引用原始密钥

    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;
        }
    
  2. # 2 楼答案

    你可以使用:

    boolean result = list1.size() == list2.size() && 
            IntStream.range(0, list1.size())
                .allMatch(i -> list1.get(i).getKey().equals(list2.get(i).getKey()));
    

    由于必须逐个元素比较List元素,因此不能使用嵌套流,因为它(如在您的示例中)只需执行笛卡尔连接,如果每个list1元素都有任何具有相同键的list2元素,则返回true(而您希望该比较具有索引意识)