【问题标题】:List to Hashmap using lambda expression使用 lambda 表达式列出到 Hashmap
【发布时间】:2017-07-14 18:23:48
【问题描述】:

你能帮我用 ArrayList 中的对象构造 Hashmap。

public class Store {

    private int storeId;
    private String storeName;
    private int deliveryDays;
    private List<String> servingZipCodes;
    private StoreAddress storeAddress;


    public Store() {
    }

    public Store(int storeId,String storeName,int deliveryDays,List<String> servingZipCodes,StoreAddress storeAddress){
        this.storeId = storeId;
        this.storeName=storeName;
        this.deliveryDays=deliveryDays;
        this.servingZipCodes=servingZipCodes;
        this.storeAddress = storeAddress;
    }

//getters and setters.
}

还有 StoreAddress 类

public class StoreAddress {

    private String streetAddress1;
    private String streetAddress2;
    private String streetAddress3;
    private String city;
    private String state;
    private String postalCode;
    private String country;
    private String phone;

    public StoreAddress() {
    }

    public StoreAddress(String streetAddress1, String streetAddress2, String streetAddress3, String city, String state, String postalCode, String country, String phone) {
        this.streetAddress1 = streetAddress1;
        this.streetAddress2 = streetAddress2;
        this.streetAddress3 = streetAddress3;
        this.city = city;
        this.state = state;
        this.postalCode = postalCode;
        this.country = country;
        this.phone = phone;
    }

这是用于测试的 Test 类。

public class Test {

    public static void main(String args[]){

        List<Store> storeList=new ArrayList();
        StoreAddress storeAddress1 = new StoreAddress("1500 Polaris Pkwy",null,null,"Columbus","OH","43240","US","9165452345");
        StoreAddress storeAddress2 = new StoreAddress("160 Easton Town Center",null,null,"Columbus","OH","43240","US","9165452345");
        storeList.add(new Store(1,"Store 1",7,new ArrayList<String>(Arrays.asList("43240","43241","43242")),storeAddress1));
        storeList.add(new Store(2,"Store 2",7,new ArrayList<String>(Arrays.asList("43240","43082","43081")),storeAddress2));
        Map<String,List<Store>> zipCodeStoreList = null;
        storeList.forEach(store -> {
            List<String> servingZipCodes = store.getServingZipCodes();
            servingZipCodes.stream().filter(x -> x.matches(store.getStoreAddress().getPostalCode().substring(0,5))).map(x ->new HashMap<String, Object>(){{
                put(x, store);
            }});
        });

虽然它在 Java 7 中是可能的,但在 Java 8 中寻找解决方案。

Key: 43240, value: Store1 , Store2
Key: 43241, value: null
Key: 43242, value: null
Key: 43082, value: null
Key: 43081, value: null

【问题讨论】:

  • 这个地图的键集应该是每个提供的邮政编码,每个值应该是提供该邮政编码的商店列表?
  • 是的,我要找的就是这个
  • 一开始你应该知道你在做什么,而不是怎么做。确实,你必须找出Stores之间的zipCodes的交集,然后在zipCodes的交集的基础上构建Map
  • 谢谢!!让我们试试吧
  • 必须是HashMap吗?

标签: java lambda java-8 java-stream


【解决方案1】:

正如我所说,您应该首先考虑做什么而不是如何,这样问题就很容易解决了。然后就可以获得自描述代码,例如:

//             v--- union all zip codes from stores
Stream<String> union = storeList.stream().map(Store::getServingZipCodes)
                                         .flatMap(List::stream)
                                         .distinct();

//             v--- find out intersections between zip codes
Stream<String> intersection = union.filter(zip ->
        storeList.stream().map(Store::getServingZipCodes)
                          .allMatch(it -> it.contains(zip))
);

//                       v--- create a Map simply from intersections 
Map<String, List<Store>> result = intersection.collect(toMap(
        Function.identity(),
        unused -> storeList
));

输出

assert result.get("43240") == [store1, store2];
assert result.get("others") == null;

【讨论】:

    【解决方案2】:

    我首先用给定的邮政编码过滤ListStores。这个给定的邮政编码是变量名key。然后我使用密钥将生成的过滤器放入Map 变量zipCodeStoreList

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     *
     * @author blj0011
     */
    public class Test
    {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args)
        {
            List<Store> storeList=new ArrayList();
            StoreAddress storeAddress1 = new StoreAddress("1500 Polaris Pkwy",null,null,"Columbus","OH","43240","US","9165452345");
            StoreAddress storeAddress2 = new StoreAddress("160 Easton Town Center",null,null,"Columbus","OH","43240","US","9165452345");
    
            storeList.add(new Store(1,"Store 1",7,new ArrayList(Arrays.asList("43240","43241","43242")),storeAddress1));
            storeList.add(new Store(2,"Store 2",7,new ArrayList(Arrays.asList("43240","43082","43081")),storeAddress2));
            Map<String,List<Store>> zipCodeStoreList = new HashMap();
    
            String key = "43241";//See if a Store associates with this zip code.
            //Add the key and the results from filtering the storeList based on the key.
            zipCodeStoreList.put(key, storeList.stream().filter(x -> x.getServingZipCodes().contains(key)).collect(Collectors.toList()));
            //Print results
            for(Map.Entry<String, List<Store>> entry : zipCodeStoreList.entrySet())
            {
                for(Store store : entry.getValue())
                {
                    System.out.println("filter 1: " + entry.getKey() + " - " + store.getStoreName());
                }
            }        
        }
    
    }
    

    列出与特定邮政编码关联的所有Stores 的更改版本。

    删除

        String key = "43081";
        zipCodeStoreList.put(key, storeList.stream().filter(x -> x.getServingZipCodes().contains(key)).collect(Collectors.toList()));
    

    替换为

        //Add the zip code belong to at least one store plus a zip code that belongs to no store.
        List<String> allZipCodes = new ArrayList(Arrays.asList("43240","43082","43081", "43240","43241","43242", "55555"));
        for(String zipCode : allZipCodes)
        {
            zipCodeStoreList.put(zipCode, storeList.stream().filter(x -> x.getServingZipCodes().contains(zipCode)).collect(Collectors.toList()));
        }
    

    【讨论】:

    • 谢谢大家让我实现
    • 您可以将输出面板的文本复制到浏览器中;无需截图和上传图片。
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2021-10-10
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2018-09-05
    • 2013-09-30
    相关资源
    最近更新 更多