代码之家  ›  专栏  ›  技术社区  ›  wosimosi

java中的函数编程:克隆与变异。好还是坏?

  •  0
  • wosimosi  · 技术社区  · 7 年前

    突变:

    “transformEmployeeNameToUpperCase”函数用于将员工姓名转换为大写。

    List<Employee> employeesStartsWithDInUppercase1 = employees.stream()
                .filter(employee -> employee.getName().startsWith("D"))
                .map(Main::transformEmployeeNameToUpperCase)
                .collect(Collectors.toList());
    
    public static Employee transformEmployeeNameToUpperCase(Employee employee){
        employee.setName(employee.getName().toUpperCase());
        return employee;
    }
    

    “createEmployeeWithUpperCaseName”函数对名称为大写的新员工。

    List<Employee> employeesStartsWithDInUppercase2 = employees.stream()
                .filter(employee -> employee.getName().startsWith("D"))
                .map(Main::createEmployeeWithUpperCaseName)
                .collect(Collectors.toList());
    
    
    public static Employee createEmployeeWithUpperCaseName(Employee e){
        return new Employee( e.getId(), e.getName().toUpperCase(), e.getDesignation(), e.getAge());
    }
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   JB Nizet    7 年前

    “createEmployeeWithUpperCaseName”是否如他们所说遵循规则1(如上)

    是:员工未被修改

    在“transformEmployeeNameToUpperCase”的情况下,是否遵循上述规则2?

    是的,尽管规则使用了不正确的术语。它创建的是一个对象,而不是一个变量。无法创建变量。

    使用transformEmployeeNameToUpperCase方式是一种好做法吗?

    不,至少不是你做这件事的方式。修改可变对象本身并没有什么坏处:它们是可变的是有原因的。但是 map()

    employees.stream()
             .filter(employee -> employee.getName().startsWith("D"))
             .forEach(e -> e.setName(e.getName().toUpperCase()));
    

    这样,就清楚地表明,管道的作用是对列表中的元素产生副作用。而且它也不会创建(可能)无用的列表副本。

        2
  •  0
  •   Sahil Verma    7 年前

    同意@JB Nizet,但如果您不想更改原始对象,但想将employee的名称更改为大写。使用对象克隆。

    伪代码:

    List<Employee> employeeWithUpperCaseName = employees.parallelStream()
                    .filter(e -> e.getName().startsWith("D"))
                    .map(x -> {
                        Employee s = null;
                        try {
                            s = (Employee) x.clone();
                            s.setName(x.getName().toUpperCase());
                        } catch (CloneNotSupportedException e) {
                            e.printStackTrace();
                        } finally {
                            return s;
                        }
                    })
                    .collect(Collectors.toList());
    

    你可以用更好的方式写。