3

我经常在基于 vavr 的代码中看到:

...
.map(x -> {
   if (someCondition(x)) {
      return doWith(x);
   } else {
     return x;
   }
})
...

有没有办法map使用某些结构从调用中消除这种逻辑?我觉得这个if条件很尴尬。

4

4 回答 4

4

使用三元条件表达式可能看起来更好:

.map(x -> someCondition(x) ? doWith(x) : x)
于 2018-04-19T05:55:55.427 回答
3

我的想法是用可选的包装 x

   .map(x -> Optional.ofNullable(x)
            .filter(this::someCondition)
            .map(this::doWith)
            .orElse(x))

这会返回Optional<X>,所以你需要在其他地方正确处理它

于 2018-04-19T07:40:15.020 回答
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;
}
于 2018-04-19T06:00:37.690 回答
0

像下面这样怎么case-match样:

Iterator.range(0, 10)
        .map(index -> Match(index).of(
            Case($(n -> n % 2 == 0), "even"),
            Case($(), "odd")
        ))
于 2018-08-25T01:19:34.410 回答