Java 8 Streams: Iterate Over a List Inside a Map

Viewed 2421

I am facing a problem in iterating over a List inside an Object which is embedded inside another map. My objective is to iterate over this list and produce a map<String,String>, I want to achieve this using streams and lamdas.

public class ModelBO {
    private String id;
    private String name;
    private String version;
    private Map<String, FolderBO> folderValues = null; 
}

public class FolderBO {
    private String id;
    private String name;
    private String type;
    private Map<String, String> properties;
    private List<ElementBO> elements = new ArrayList<ElementBO>();
}

public class ElementBO {
    private String id;
    private String name;
    private String type;
}

I seen above i need to create a map with map<id,name> from the elementBo by iterating over elementList which is inside the folderBo. The folderBo itself is inside the map of ModelBo.

I have written the following code.

  Map<String,String> elementMap = 
    UniModelBO.getInstance().getFolderValues().entrySet().stream()
       .filter(entrySet -> entrySet.getKey()!="relations")
       .map(entrySet -> entrySet.getValue().getElements()::stream)
       .collect(Collectors.toMap(ElementBO::getName, ElementBO::getId));

UniModelBO is utility class that creates a singleton object for ModelBo.

1 Answers

You are almost there, just use flatMap to convert the nested List stream into a single stream. And I will also recommended to use the equals method for string comparison:

Map<String, String> elementMap =
        UniModelBO.getInstance().getFolderValues().entrySet().stream()
                .filter(entrySet -> !entrySet.getKey().equals("relations"))
                .flatMap(entrySet -> entrySet.getValue().getElements().stream())
                .collect(Collectors.toMap(ElementBO::getName, ElementBO::getId));
                           
Related