if-logic消除地图调用

时间:2018-04-19 05:54:30

标签: java if-statement vavr

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

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

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

4 个答案:

答案 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")
        ))