我经常在基于 vavr 的代码中看到:
...
.map(x -> {
if (someCondition(x)) {
return doWith(x);
} else {
return x;
}
})
...
有没有办法map
使用某些结构从调用中消除这种逻辑?我觉得这个if
条件很尴尬。
我经常在基于 vavr 的代码中看到:
...
.map(x -> {
if (someCondition(x)) {
return doWith(x);
} else {
return x;
}
})
...
有没有办法map
使用某些结构从调用中消除这种逻辑?我觉得这个if
条件很尴尬。
使用三元条件表达式可能看起来更好:
.map(x -> someCondition(x) ? doWith(x) : x)
我的想法是用可选的包装 x
.map(x -> Optional.ofNullable(x)
.filter(this::someCondition)
.map(this::doWith)
.orElse(x))
这会返回Optional<X>
,所以你需要在其他地方正确处理它
如果条件不包含任何逻辑或很少,则使用三元运算符
.map(x -> someCondition(x) ? doWith(x) : x)
或者在方法中提取地图中的逻辑
.map(ClassName::myXTreatmentMethod)
// or
.map(this::myXTreatmentMethod)
随着myXTreatmentMethod
存在
public X_Type myXTreatmentMethod(X_Type x) {
if (someCondition(x)) {
// some logic
return doWith(x);
}
return x;
}
像下面这样怎么case-match
样:
Iterator.range(0, 10)
.map(index -> Match(index).of(
Case($(n -> n % 2 == 0), "even"),
Case($(), "odd")
))