Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果存在多个间歇中断/返回,声明式样式是否会失败?_Java_Functional Programming_Java Stream_Vavr - Fatal编程技术网

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条件进行检查,我编辑了问题,请您检查。