请考虑以下课程:
ClassA {
}
ClassB {
private ClassA classA;
// getters and setters
}
由于peek
上没有Optional
方法可用,因此认为这是在滥用Optional#map
方法:
return myService.findA()
.flatMap(a -> myService.findB(a) // also returns optional
.map(b -> {
b.setClassA(a);
return b;
}))
.map(d -> MyType.of(d)) // MyType being other class
.orElse(MyType.empty());
这也可以这样写:
Optional<ClassA> optionalA = myService.findA();
if (optionalA.isPresent()) {
Optional<ClassB> optionalB = myService.findB(optionalA.get());
if (optionalB.isPresent()) {
ClassB classB = optionalB.get();
classB.setClassA(optionalA.get());
return MyType.of(classB);
}
return MyType.empty();
两个实现都执行相同的逻辑,是否应该优先选择另一个?
答案 0 :(得分:3)
在我看来,x <- 2
test()
[1] 4
并没有暗示rm(x); test2 <- function() { x <- 2; test() }; test2()
,这似乎很奇怪,因为它既有范围,但无论如何,这里没有必要滥用myService.findB(a)
:< / p>
b.setClassA(a)
答案 1 :(得分:1)
因此,当您应用功能设计原则时,就永远不会更新状态。这意味着没有任何允许这样做的数据结构(如带有该setter的ClassB
的情况)。您宁愿使用更新后的值返回该类的新实例。而且,如果这样做,则无需map
或flatMap
来“滥用”,但您可以使用闭包代替:
return myService.findA()
.flatMap(a -> myService.findB(a).map(b -> b.copyWith(a)))
.map(MyType::of)
.orElse(MyType.empty());
答案 2 :(得分:0)
我可能更喜欢第一个实现,因为Optional提供了转换的主要功能,我认为最好将其很好地利用。