如果存在多个间歇性的中断/返回,声明式样式是否会失败?

时间:2019-10-07 09:37:02

标签: 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 (entry.getKey().isEmpty()) {
        return "empty_key";
    } else if (entry.getValue().isEmpty()) {
        return "empty_value";
    }
}
return "all_valid";

2 个答案:

答案 0 :(得分:1)

您应该寻找第一个无效的条目。如果找不到,则所有条目均有效。如果发现无效条目,请检查密钥是否无效或值无效。

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");

答案 1 :(得分:0)

使用StreamEx,您可以有效地加入mapfilter

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");

或者使用普通的Streamnull

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");