gpt4 book ai didi

java - OOP 语言的函数式编程

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:47 24 4
gpt4 key购买 nike

不可变对象(immutable对象)可以,但是非最终本地引用可以吗?

换句话说,下一个代码片段可以表示为函数式风格吗?

Employee e = new Employee("Lex", 24, 250);
e = Employee.setName(e, "Vasili");
e = Employee.setAge(e, 12);
e = Employee.setSalary(e, 2500);
Employee.log(e);

附言这里所有的 Employee 方法都是静态的,setter 是返回新实例的工厂方法。

最佳答案

由于这个问题被标记为“java”,我假设问题是关于 Java 中的 FP 实践(即不变性)。

当今 Java 的良好实践是使用构建器:

Employee e = Employee.builder()
.surname("Lex")
.age(24)
.name("Vasili")
.salary(2500)
.build();

或静态构造器:

Employee e = Employee.of("Vasili", "Lex", 24, 2500);

在这两种情况下,“经典”构造函数都应声明为私有(private)的,以确保对象不会在不一致的状态下被实例化并提供给客户端。

然后对象修改器应该返回新对象:

Employee.of("Vasili", "Lex", 24, 2500)  // creates an object
.updateName("Sergey") // returns 1st modified copy
.updateSalary(3500); // returns 2nd modified copy based on 1st copy

遵循这些做法,对非最终本地引用的需求通常会消失。
一个非常流行的例子是 Date and Time API .

现在,关于使用可变局部变量。没关系,但是可以使用方法链缩短代码并使其更具表现力。尝试按原样链接静态方法看起来不会很优雅:

Employee e = setSalary(setAge(setName(new Employee("Lex", 24, 250), "Vasili"), 12), 2500);

作为模拟 monad 的尝试,可以将对象包装在一些类似 monad 的容器中,该容器定义了一个接受函数的绑定(bind)方法,该函数将接受存储在 monad 中的对象并返回一些结果,该结果将再次被包装在一个单子(monad)里。一个简单的示例如下所示:

static class Employee {
public String name;
public int age;
public long salary;
}

static class Monad<T> {
private final T value;

private Monad(T value) { this.value = value; }

public static <T> Monad<T> of(T value) {
return new Monad<>(value);
}

public T getValue() { return value; }

public Monad<T> bind(UnaryOperator<T> operator){
return of(operator.apply(value));
}
}

public static void main(String[] args) {
Employee value = Monad.of(new Employee())
.bind(e -> {e.name = "Lex"; return e; })
.bind(e -> {e.age = 24; return e; })
.bind(e -> {e.salary = 2500; return e; })
.getValue();
}

但这可以通过版本 8 之后的核心 Java 来完成 - Stream API可以做到这一点以及更多:

Stream.of(new Employee())
.map(e -> {e.name = "Lex"; return e; })
.map(e -> {e.age = 24; return e; })
.map(e -> {e.salary = 2500; return e; })
.findFirst()
.get();

关于java - OOP 语言的函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48934698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com