Java 从map调用中消除if逻辑
我经常在基于vavr的代码中看到:Java 从map调用中消除if逻辑,java,if-statement,vavr,Java,If Statement,Vavr,我经常在基于vavr的代码中看到: ... .map(x -> { if (someCondition(x)) { return doWith(x); } else { return x; } }) ... 是否有任何方法可以使用某些构造从map调用中消除此逻辑?我发现这if条件很尴尬。使用三元条件表达式可能看起来更好: .map(x -> someCondition(x) ? doWith(x) : x) 如果条件不包含任何逻辑或很少逻辑
...
.map(x -> {
if (someCondition(x)) {
return doWith(x);
} else {
return x;
}
})
...
是否有任何方法可以使用某些构造从
map
调用中消除此逻辑?我发现这if
条件很尴尬。使用三元条件表达式可能看起来更好:
.map(x -> someCondition(x) ? doWith(x) : 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;
}
我的想法是用可选的
.map(x -> Optional.ofNullable(x)
.filter(this::someCondition)
.map(this::doWith)
.orElse(x))
这将返回
可选
,因此您需要在其他地方正确处理它那么大小写匹配如何
如下所示:
Iterator.range(0, 10)
.map(index -> Match(index).of(
Case($(n -> n % 2 == 0), "even"),
Case($(), "odd")
))
事实上,这并没有改变什么。它是否是
if
语句的三元组并不重要。但是谢谢你的想法。@Opal它减少了代码的长度。它消除了使用大括号和返回语句的需要。因此,我想说,如果使用if
,它就不会那么尴尬了。是的,我看到了,但是这不是我想要的。我要找的是一些我不知道的vavr或功能结构。然而;)我想要的是一个概念,而你建议的只是语法。@Opal我想你希望有一个流方法,比如mapIf(谓词,函数)
,但它并不存在。虽然这样做有效,但这是过火了,更重要的是,它没有这个意图。您的代码很难理解您想要有条件地转换元素。三元运算符或if-else语句更具表现力。当然,对于某些人来说,这可能是一种过激的行为,但这只是我/另一种替换if语句的方法