Java 8 List into Map

前端 未结 22 2458
半阙折子戏
半阙折子戏 2020-11-22 03:38

I want to translate a List of objects into a Map using Java 8\'s streams and lambdas.

This is how I would write it in Java 7 and below.

private Map&l         


        
相关标签:
22条回答
  • 2020-11-22 04:24

    If every new value for the same key name has to be overridden:

    public Map < String, Choice > convertListToMap(List < Choice > choices) {
        return choices.stream()
            .collect(Collectors.toMap(Choice::getName,
                Function.identity(),
                (oldValue, newValue) - > newValue));
    }
    

    If all choices have to be grouped in a list for a name:

    public Map < String, Choice > convertListToMap(List < Choice > choices) {
        return choices.stream().collect(Collectors.groupingBy(Choice::getName));
    }
    
    0 讨论(0)
  • 2020-11-22 04:25

    I was trying to do this and found that, using the answers above, when using Functions.identity() for the key to the Map, then I had issues with using a local method like this::localMethodName to actually work because of typing issues.

    Functions.identity() actually does something to the typing in this case so the method would only work by returning Object and accepting a param of Object

    To solve this, I ended up ditching Functions.identity() and using s->s instead.

    So my code, in my case to list all directories inside a directory, and for each one use the name of the directory as the key to the map and then call a method with the directory name and return a collection of items, looks like:

    Map<String, Collection<ItemType>> items = Arrays.stream(itemFilesDir.listFiles(File::isDirectory))
    .map(File::getName)
    .collect(Collectors.toMap(s->s, this::retrieveBrandItems));
    
    0 讨论(0)
  • 2020-11-22 04:26

    One more option in simple way

    Map<String,Choice> map = new HashMap<>();
    choices.forEach(e->map.put(e.getName(),e));
    
    0 讨论(0)
  • 2020-11-22 04:27

    For example, if you want convert object fields to map:

    Example object:

    class Item{
            private String code;
            private String name;
    
            public Item(String code, String name) {
                this.code = code;
                this.name = name;
            }
    
            //getters and setters
        }
    

    And operation convert List To Map:

    List<Item> list = new ArrayList<>();
    list.add(new Item("code1", "name1"));
    list.add(new Item("code2", "name2"));
    
    Map<String,String> map = list.stream()
         .collect(Collectors.toMap(Item::getCode, Item::getName));
    
    0 讨论(0)
  • 2020-11-22 04:32

    Use getName() as the key and Choice itself as the value of the map:

    Map<String, Choice> result =
        choices.stream().collect(Collectors.toMap(Choice::getName, c -> c));
    
    0 讨论(0)
  • 2020-11-22 04:32

    Here is solution by StreamEx

    StreamEx.of(choices).toMap(Choice::getName, c -> c);
    
    0 讨论(0)
提交回复
热议问题