【问题标题】:Can I use map to set the value for other objects in java8 stream?我可以使用 map 为 java8 流中的其他对象设置值吗?
【发布时间】:2021-04-17 17:09:10
【问题描述】:

Am I allowed to write code this way?

我可以在 map 方法中使用 setter 将值设置为使用流的其他对象吗?

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(csvPath))) {
        List<Employee> employees = bufferedReader
                .lines()
                .skip(1)
                .map(l -> {
                    String[] lines = l.split(",");
                    Employee employee = new Employee();
                    employee.setEmployeeId(Long.parseLong(lines[0]));
                    employee.setFullName(lines[1] + " " + lines[2] + " " + lines[3]);
                    employee.setGender(lines[4]);
                    employee.setEmail(lines[5]);
                    employee.setSalary(Double.parseDouble(lines[6]));
                    employee.setState((lines[7]));
                    return employee;
        }).collect(Collectors.toList());

【问题讨论】:

标签: java lambda collections java-8 java-stream


【解决方案1】:

是的,你可以。虽然我不建议这样做。

只需将该逻辑提取到单独的方法中即可:

Employee parseEmployee(String line) {
    String[] columns = line.split(",");
    Employee employee = new Employee();
    employee.setEmployeeId(Long.parseLong(columns[0]));
    employee.setFullName(columns[1] + " " + columns[2] + " " + columns[3]);
    employee.setGender(columns[4]);
    employee.setEmail(columns[5]);
    employee.setSalary(Double.parseDouble(columns[6]));
    employee.setState((columns[7]));
    return employee;
}

然后只需将方法引用传递给map

List<Employee> employees = bufferedReader.lines()
                                         .skip(1)
                                         .map(this::parseEmployee)
                                         .collect(toList());

这将使您的代码更具可读性和更易于维护。

【讨论】:

    【解决方案2】:

    我会建议将逻辑移到Employee构造函数中

    public Employee(String[] lines) {
      this.employeeId = Long.parseLong(lines[0]);
      this.fullName = lines[1] + " " + lines[2] + " " + lines[3];
      this.gender = lines[4];
      this.email = lines[5];
      this.salary = Double.parseDouble(lines[6]);
      this.state = lines[7];
    
     }
    

    然后只需使用构造函数创建Employee 对象

    List<Employee> employees = bufferedReader
                .lines()
                .skip(1)
                .map(l-> l.split(","))
                .map(Employee::new)
                .collect(Collectors.toList());
    

    【讨论】:

    • 如果你有额外的地图,你可以使用 Employee::new
    猜你喜欢
    • 2015-09-14
    • 2019-02-02
    • 2021-07-13
    • 1970-01-01
    • 2019-02-05
    • 2015-11-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多