如果对象中的特定字段与单独列表中的任何值匹配,则从列表中获取对象<Object>

Get Object from List<Object> if a particular field in Object matches any value from a separate list

我有一个包含所有商店编号的字符串列表:

List<String> stores = new ArrayList<>; 

还有一个对象列表,例如:

List<UserStores> userStores = new ArrayList<>;

现在,这个 UserStores class 看起来像这样:

public class UserStores {
    
    private String storeNo;
    private String storeName;
    private String country;
}

如果上面给出的 'stores' 列表中存在任何 storeNo,我想从此 List<UserStores> 获取所有 UserStores。

例如,

stores = {1,2};
UserStores = [ {2, qwe, wqew}, {1,ABC, India}, {3, asd, USA} ];

expected result = [{1,ABC, India}, {2, qwe, wqew}]; in the order of stores present in 'stores' list,

如何使用 stream/collectors 获取此信息?

我当前的代码是这样的..可以改进吗?

private static List<UserStores> getModifiedUserStoresList(
            List<String> stores, List<UserStores> userStores
    ) {
        List<UserStores> userStoreList = new ArrayList<>();
        
       
        for(int i = 0; i < stores.size(); i++) {
            for(int j = 0; j < userStores.size(); j++) {
                if(userStores.get(j).getStoreNo().equals(stores.get(i))) {
                    userStoreList.add(userStores.get(j));
                    break;
                }
            }
        }
        return userStoreList;
    }

您可以使用流 API 并过滤 UserStores 列表:

List<UserStores> filtered = userStores.stream()
    .filter(u -> stores.contains(u.getStoreNo()))
    .collect(Collectors.toList());

为了保持正确的顺序并保留重复项,应首先创建映射 Map<String, UserStores>(例如,使用 Collectors.toMap),然后 stores 应通过适当的键进行流式传输和映射:

private static List<UserStores> getModifiedUserStoresList(
        List<String> stores, List<UserStores> userStores
) {
    Map<String, UserStores> map = userStores.stream()
        .collect(Collectors.toMap(UserStores::getStoreNo, us -> us, (a, b) -> a));
        
    return stores.stream()
        .filter(map::containsKey)
        .map(map::get)
        .collect(Collectors.toList());
}