【问题标题】:Stream on List to get element and also from inner elements在 List 上流以获取元素以及从内部元素中获取
【发布时间】:2021-10-24 08:16:54
【问题描述】:

我有一个从 Json 填充的 Employee 对象的 List

{
  "emp": [
    {
      "name": "John",
      "id": "123",
      "reportingEmp": [
        {
          "name": "Mark",
          "id": "342"
        },
        {
          "name": "Mike",
          "id": "342"
        },
        {
          "name": "Lindsey",
          "id": "342"
        }
      ]
    },
    {
      "name": "Steve",
      "id": "123"
    },
    {
      "name": "Andrew",
      "id": "123"
    }
  ]
}
class Employee {
private String name;
private String id;
private List<Employee> reportingEmp;
}

现在我想获取所有员工的姓名,包括流中的报告员工。

我可以使用下面的方法来获取所有员工,但它会错过报告员工

List&lt;String&gt; names = emp.stream().map(Employee::getName).collect(toList());

但上面只给出John,Steve and Andrew,但我想要下面的列表

John
Mark
Mike
Lindsey
Steve
Andrew

【问题讨论】:

  • 如果报告员工也有报告员工怎么办?你也想要这些吗?
  • @Sweeper 举报员工将没有举报员工
  • employees.stream().collect(ArrayList::new, (names, employee) -&gt; { if (employee.getReportingEmp() != null) names.addAll(employee.getReportingEmp().stream().map(Employee::getName).collect(Collectors.toList()));names.add(employee.getName());}, ArrayList::addAll);

标签: java list java-8


【解决方案1】:

flatMap 是要使用的东西,当您想将一个事物(Employee)映射到多个事物(员工姓名 + 所有报告员工姓名)时。

flatMap lambda 中,您只需要创建一个流,其中包含您想要将该员工映射到的内容,因此:

List<String> names = employees.stream().flatMap(emp ->
    Stream.concat(
        // the employee's name,
        Stream.of(emp.getName()), // and
        // the employee's reporting employees' names
        emp.getReportingEmp().stream().map(Employee::getName)
    )
).collect(Collectors.toList());

如果getReportingEmp可以返回null,那么你可以这样做:

List<String> names = employees.stream().flatMap(emp ->
    Stream.concat(
        Stream.of(emp.getName()),
        Optional.ofNullable(emp.getReportingEmp()).map(
            x -> x.stream().map(Employee::getName)
        ).orElse(Stream.of())
    )
).collect(Collectors.toList());

【讨论】:

  • 值得一提的是emp.getReportingEmp() 似乎是可选的,可能需要基于此更新实现
  • 是的,它可能正在查看 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2019-05-22
  • 2016-09-02
  • 2021-10-30
  • 1970-01-01
  • 2014-08-24
相关资源
最近更新 更多