I have below entities Manager
and Colleague
Manager Entity
@Entity @Table(name = "Manager") @Data public class Manager implements java.io.Serializable { @Id @Column(name = "id") private Long id; @Column(name = "name") private String name; @OneToMany @JoinColumn(name = "id") private List<Colleague> colleagues; }
Colleague Entity
@Entity @Table(name = "Colleague") @Data public class Colleague implements java.io.Serializable { @Id @Column(name = "id") private Long id; @Column(name = "name") private String name; }
Above relation can be represented in JSON
as
[ { "id": "101", "name": "manager1", "colleagues": [ { "id": "101", "name": "colleague1" }, { "id": "101", "name": "colleague2" } ] }, { "id": "101", "name": "manager2", "colleagues": [ { "id": "101", "name": "colleague3" }, { "id": "101", "name": "colleague4" } ] } ]
I am retrieving the result on managerReposiotry.findAll()
as
List<Manager> managerList = managerReposiotry.findAll();
I want to create a super list of all names from Manager
and Colleague
What I am currently doing is
List<String> names = new ArrayList<>(); managerList.stream() .forEach(manager -> { List<String> nameList = manager.getColleagues().stream() .map(colleague -> colleague.getName()) .collect(Collectors.toList()); names.addAll(nameList); } );
Is there any other way in Java-8
to improve the above code?
Thank you !!
Advertisement
Answer
You can use flatMap
to flatten all Colleague
of Manager
then map Colleague
name only and collect as list.
List<String> names = managerList.stream() // ...Stream<Manager> .flatMap(m -> m.getColleagues().stream()) // ...Stream<Colleague> .map(c-> c.getName()) // ...Stream<String> .collect(Collectors.toList());
But the better way is directly fetched from the database if all colleagues have manager.
@Query("select c.name from Colleagues c") List<String> findAllColleagueName();