Java 如果存在多个间歇中断/返回,声明式样式是否会失败?
下面的代码是命令式风格的直观代码。在声明式风格中尝试同样的操作会使它变得更复杂吗Java 如果存在多个间歇中断/返回,声明式样式是否会失败?,java,functional-programming,java-stream,vavr,Java,Functional Programming,Java Stream,Vavr,下面的代码是命令式风格的直观代码。在声明式风格中尝试同样的操作会使它变得更复杂吗 for (var entry : map.entrySet()) { if (entry.getKey().length() > 10) { return "invalid_key"; } else if (entry.getValue().length() > 10) { return "invalid_value"; } else if (en
for (var entry : map.entrySet()) {
if (entry.getKey().length() > 10) {
return "invalid_key";
} else if (entry.getValue().length() > 10) {
return "invalid_value";
} else if (entry.getKey().isEmpty()) {
return "empty_key";
} else if (entry.getValue().isEmpty()) {
return "empty_value";
}
}
return "all_valid";
您应该查找第一个无效条目。如果没有,则所有条目都有效。如果您发现一个无效条目,您将检查该键是否无效或该值是否无效
return map.entrySet()
.stream()
.filter(entry -> entry.getKey().length() > 10 || entry.getValue().length() > 10)
.findFirst()
.map(entry -> entry.getKey().length() > 10 ? "invalid_key" : "invalid_value")
.orElse("all_valid");
使用,您可以有效地加入映射
和过滤器
:
return EntryStream.of(map).mapKeyValuePartial((key, value) -> {
if (key.length() > 10) {
return Optional.of("invalid_key");
} else if (value.length() > 10) {
return Optional.of("invalid_value");
} else {
return Optional.empty();
}).findFirst().orElse("all_valid");
或者使用纯流
和空
:
return map.entrySet().stream().map(entry -> {
if (entry.getKey().length() > 10) {
return "invalid_key";
} else if (entry.getValue().length() > 10) {
return "invalid_value";
} else {
return null;
}).filter(x -> x != null).findFirst().orElse("all_valid");
这一点也不直观,这违背了readability@GopalSAkshintala在这种情况下,为什么不保留原始代码呢?我想可读性是一个主观问题(你越习惯流,它就会变得越可读)。我们在这个管道中有“findFirst”,它更容易理解,然后用return语句打破循环以实现相同的目标@GopalSAkshintala@Eran问题不是
findFirst
;它复制了entry.getKey()。这两种情况都可以避免。@Eran感谢您努力回答,很抱歉我的粗鲁评论,当时处于开发人员的沮丧地带:)我觉得这可能很快变得麻烦,如果我添加更多的if/else条件进行检查,我编辑了问题,请您检查。