我经常在基于vavr的代码中看到:
...
.map(x -> {
if (someCondition(x)) {
return doWith(x);
} else {
return x;
}
})
...
有没有办法使用某些结构从map
调用中消除此逻辑?我发现这个if
条件很尴尬。
答案 0 :(得分:4)
使用三元条件表达式可能看起来更好:
.map(x -> someCondition(x) ? doWith(x) : x)
答案 1 :(得分:3)
我的想法是用可选的
包装x .map(x -> Optional.ofNullable(x)
.filter(this::someCondition)
.map(this::doWith)
.orElse(x))
这会返回Optional<X>
,所以你需要在其他地方正确处理它
答案 2 :(得分:2)
如果条件不包含任何逻辑或非常少
,则使用三元运算符.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;
}
答案 3 :(得分:0)
case-match
如下所示:
Iterator.range(0, 10)
.map(index -> Match(index).of(
Case($(n -> n % 2 == 0), "even"),
Case($(), "odd")
))