У меня есть Set<Map<String, Object>>
. Элементы приведены ниже:
final Set<Map<String, Object>> set = new HashSet<>();
final Map<String, Object> objectMap1 = new HashMap<>();
objectMap1.put("name", "Sourav");
objectMap1.put("class", 10);
objectMap1.put("city", "London");
objectMap1.put("Department", "Science");
final Map<String, Object> objectMap2 = new HashMap<>();
objectMap2.put("name", "Sourav");
objectMap2.put("class", 10);
objectMap2.put("city", "Kolkata");
objectMap2.put("Department", "Science");
final Map<String, Object> objectMap3 = new HashMap<>();
objectMap3.put("name", "Wills");
objectMap3.put("class", 9);
objectMap3.put("city", "Peterborough");
objectMap3.put("Department", "Java");
final Map<String, Object> objectMap4 = new HashMap<>();
objectMap4.put("name", "Wills");
objectMap4.put("class", 9);
objectMap4.put("city", "Manchester");
objectMap4.put("Department", "Java");
set.add(objectMap1);
set.add(objectMap2);
set.add(objectMap3);
set.add(objectMap4);
Согласно приведенному выше примеру студент может проживать в двух городах.
Я хочу получить окончательный список StudentBuilder, где каждый элемент списка будетесть список городов.
Ожидаемый результат: [{"name": Sourav, "city": [London, Kolkata], "Department", "Science", "Standard": 10}, {"name": Wills," city ": [Manchester, Peterborough]," Department "," Java "," Standard ": 9}]
Я сделал это следующим образом, но я использовал два цикла, которыеэто не очень хорошая производительность. Можем ли мы сделать это за один цикл? Ограничения: StudentBuilder не может быть изменен. Это неизменный и сторонний кувшин.
public class TestMain {
public static void main(String[] args) {
final Set<Map<String, Object>> set = new HashSet<>();
final Map<String, Object> objectMap1 = new HashMap<>();
objectMap1.put("name", "Sourav");
objectMap1.put("class", 10);
objectMap1.put("city", "London");
objectMap1.put("Department", "Science");
final Map<String, Object> objectMap2 = new HashMap<>();
objectMap2.put("name", "Sourav");
objectMap2.put("class", 10);
objectMap2.put("city", "Kolkata");
objectMap2.put("Department", "Commerce");
final Map<String, Object> objectMap3 = new HashMap<>();
objectMap3.put("name", "Wills");
objectMap3.put("class", 10);
objectMap3.put("city", "Peterborough");
objectMap3.put("Department", "Computer");
final Map<String, Object> objectMap4 = new HashMap<>();
objectMap4.put("name", "Wills");
objectMap4.put("class", 9);
objectMap4.put("city", "Manchester");
objectMap4.put("Department", "Java");
set.add(objectMap1);
set.add(objectMap2);
set.add(objectMap3);
set.add(objectMap4);
final Map<String, List<String>> locationGroupsByStudent = new HashMap<>();
set.forEach(a -> {
locationGroupsByStudent.computeIfAbsent((String)a.get("name"), k -> new ArrayList<>()).add((String)a.get("city"));
});
final List<StudentBuilder> studentList = set.stream()
.filter(d -> locationGroupsByStudent.containsKey(d.get("name")))
.map(d -> {
final List<String> locationGroupNames = locationGroupsByStudent.get(d.get("name"));
locationGroupsByStudent.remove(d.get("name"));
return StudentBuilder.builder()
.name((String)d.get("name"))
.cities(locationGroupNames)
.department((String)d.get("Department"))
.standard((Integer)d.get("class"))
.build();
})
.collect(Collectors.toList());
}