JAVA Stream API -> 根据条件检查两个列表中的元素

问题描述 投票:0回答:1

我有两个类型为 List> 的列表。 列表>列表1和列表>列表2

如果 list2 中有条目,我想要 list2 的条目。如果 list2 中不存在特定条目,我希望检索 list1 数据。

list1 总是有数据,list2 在某些条件下会有一些数据。

如何在 Stream API 中实现这一点

我有两个类型为 List> 的列表。列表>列表1和列表>列表2

如果 list2 中有条目,我想要 list2 的条目。如果 list2 中不存在特定条目,我希望检索 list1 数据。

list1 总是有数据,list2 在某些条件下会有一些数据。

如何在 Stream API 中实现这一点

List> listFiltered = liat1.stream().filter(data -> {

            List<Map<String, Object>> list = list2.stream().filter(t -> t.get("key") != null &&  t.get("key").equals( data.get("key"))).collect(Collectors.toList());
            if(CollectionUtils.isNotEmpty(list)) {
                return false;
            } else {
                return true;
            }
        }
        ).collect(Collectors.toList());
java-8 stream
1个回答
0
投票

您可以使用 concat 与自定义逻辑来选择键,如下例所示。

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main
{
    public static void main(String[] args) {
        
        Map<String, Object> indiaMap1 = new HashMap<>();
        indiaMap1.put("stdcode", 91);
        indiaMap1.put("ISO", "IND");

       /*Map<String, Object> usaMap1 = new HashMap<>();
        usaMap1.put("stdcode", 1);
        usaMap1.put("ISO", "USA");*/

        List<Map<String, Object>> list1 = new ArrayList<>();
        list1.add(Map.of("India", indiaMap1));
        /*list1.add(Map.of("USA", usaMap1));*/

    // Second List (with updated or new entries)
    Map<String, Object> indiaMap2 = new HashMap<>();
    indiaMap2.put("stdcode", 92); // Updated stdcode for India
    indiaMap2.put("ISO", "IND");

    Map<String, Object> canadaMap2 = new HashMap<>();
    canadaMap2.put("stdcode", 2);
    canadaMap2.put("ISO", "CAN");

    List<Map<String, Object>> list2 = new ArrayList<>();
    list2.add(Map.of("India", indiaMap2));
    list2.add(Map.of("Canada", canadaMap2));

    // Merging lists
    List<Map<String, Object>> mergedList = Stream.concat(list1.stream(), list2.stream())
        .collect(Collectors.toMap(
            map -> map.keySet().iterator().next(), // Assumes each map has only one key
            Function.identity(),
            (mapFromList1, mapFromList2) -> mapFromList2 // Prioritize entry from list2
        ))
        .values()
        .stream()
        .collect(Collectors.toList());

    // Output the merged list
    mergedList.forEach(System.out::println);
        

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.