如何在Java 8中将来自同一关系的两个列表合并。

huangapple go评论158阅读模式
英文:

How to combine two lists from the same relation in Java-8

问题

我有以下实体 ManagerColleague

Manager 实体

  1. @Entity
  2. @Table(name = "Manager")
  3. @Data
  4. public class Manager implements java.io.Serializable {
  5. @Id
  6. @Column(name = "id")
  7. private Long id;
  8. @Column(name = "name")
  9. private String name;
  10. @OneToMany
  11. @JoinColumn(name = "id")
  12. private List<Colleague> colleagues;
  13. }

Colleague 实体

  1. @Entity
  2. @Table(name = "Colleague")
  3. @Data
  4. public class Colleague implements java.io.Serializable {
  5. @Id
  6. @Column(name = "id")
  7. private Long id;
  8. @Column(name = "name")
  9. private String name;
  10. }

上述关系可以表示为 JSON

  1. [
  2. {
  3. "id": "101",
  4. "name": "manager1",
  5. "colleagues": [
  6. {
  7. "id": "101",
  8. "name": "colleague1"
  9. },
  10. {
  11. "id": "101",
  12. "name": "colleague2"
  13. }
  14. ]
  15. },
  16. {
  17. "id": "101",
  18. "name": "manager2",
  19. "colleagues": [
  20. {
  21. "id": "101",
  22. "name": "colleague3"
  23. },
  24. {
  25. "id": "101",
  26. "name": "colleague4"
  27. }
  28. ]
  29. }
  30. ]

我正在使用 managerReposiotry.findAll() 检索结果:

  1. List<Manager> managerList = managerReposiotry.findAll();

我想要创建一个包含来自 ManagerColleague 的所有姓名的超级列表。

我目前正在执行以下操作:

  1. List<String> names = new ArrayList<>();
  2. managerList.stream()
  3. .forEach(manager -> {
  4. List<String> nameList =
  5. manager.getColleagues().stream()
  6. .map(colleague -> colleague.getName())
  7. .collect(Collectors.toList());
  8. names.addAll(nameList);
  9. }
  10. );

Java 8 中是否有其他方法可以改进上述代码?

谢谢!

英文:

I have below entities Manager and Colleague

Manager Entity

  1. @Entity
  2. @Table(name = &quot;Manager&quot;)
  3. @Data
  4. public class Manager implements java.io.Serializable {
  5. @Id
  6. @Column(name = &quot;id&quot;)
  7. private Long id;
  8. @Column(name = &quot;name&quot;)
  9. private String name;
  10. @OneToMany
  11. @JoinColumn(name = &quot;id&quot;)
  12. private List&lt;Colleague&gt; colleagues;
  13. }

Colleague Entity

  1. @Entity
  2. @Table(name = &quot;Colleague&quot;)
  3. @Data
  4. public class Colleague implements java.io.Serializable {
  5. @Id
  6. @Column(name = &quot;id&quot;)
  7. private Long id;
  8. @Column(name = &quot;name&quot;)
  9. private String name;
  10. }

Above relation can be represented in JSON as

  1. [
  2. {
  3. &quot;id&quot;: &quot;101&quot;,
  4. &quot;name&quot;: &quot;manager1&quot;,
  5. &quot;colleagues&quot;: [
  6. {
  7. &quot;id&quot;: &quot;101&quot;,
  8. &quot;name&quot;: &quot;colleague1&quot;
  9. },
  10. {
  11. &quot;id&quot;: &quot;101&quot;,
  12. &quot;name&quot;: &quot;colleague2&quot;
  13. }
  14. ]
  15. },
  16. {
  17. &quot;id&quot;: &quot;101&quot;,
  18. &quot;name&quot;: &quot;manager2&quot;,
  19. &quot;colleagues&quot;: [
  20. {
  21. &quot;id&quot;: &quot;101&quot;,
  22. &quot;name&quot;: &quot;colleague3&quot;
  23. },
  24. {
  25. &quot;id&quot;: &quot;101&quot;,
  26. &quot;name&quot;: &quot;colleague4&quot;
  27. }
  28. ]
  29. }
  30. ]

I am retrieving the result on managerReposiotry.findAll() as

  1. List&lt;Manager&gt; managerList = managerReposiotry.findAll();

I want to create a super list of all names from Manager and Colleague

What I am currently doing is

  1. List&lt;String&gt; names = new ArrayList&lt;&gt;();
  2. managerList.stream()
  3. .forEach(manager -&gt; {
  4. List&lt;String&gt; nameList =
  5. manager.getColleagues().stream()
  6. .map(colleague -&gt; colleague.getName())
  7. .collect(Collectors.toList());
  8. names.addAll(nameList);
  9. }
  10. );

Is there any other way in Java-8 to improve the above code?

Thank you !!

答案1

得分: 3

你可以使用 flatMap 来展开所有 ManagerColleague,然后仅获取 Colleague 的姓名并以列表形式收集。

  1. List<String> names =
  2. managerList.stream() // ...Stream<Manager>
  3. .flatMap(m -> m.getColleagues().stream()) // ...Stream<Colleague>
  4. .map(c -> c.getName()) // ...Stream<String>
  5. .collect(Collectors.toList());

但更好的方式是,如果所有的同事都有经理,直接从数据库中获取。

  1. @Query("select c.name from Colleagues c")
  2. List<String> findAllColleagueName();
英文:

You can use flatMap to flatten all Colleague of Manager then map Colleague name only and collect as list.

  1. List&lt;String&gt; names =
  2. managerList.stream() // ...Stream&lt;Manager&gt;
  3. .flatMap(m -&gt; m.getColleagues().stream()) // ...Stream&lt;Colleague&gt;
  4. .map(c-&gt; c.getName()) // ...Stream&lt;String&gt;
  5. .collect(Collectors.toList());

But the better way is directly fetched from the database if all colleagues have manager.

  1. @Query(&quot;select c.name from Colleagues c&quot;)
  2. List&lt;String&gt; findAllColleagueName();

huangapple
  • 本文由 发表于 2020年9月2日 13:13:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/63699071.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定