java - 函数式 java 8 与传统 java

标签 java java-8 functional-programming

几周以来我一直在尝试使用 java 进行函数式编程。我在“validateFileFunctionally”和“validateFileRegularly”下面创建了两个函数,它们执行相同的验证。第一个使用谓词以函数方式工作(我们可以假设供应商、消费者也在这里),而第二个则以传统的 java 方式工作。

2018年我该走哪条路。 我应该尝试在代码中的任何地方使用函数式编程(如在“validateFileFunctionally”中完成的那样)还是仅使用 Streams 进行?

public class Main {

private final String INVALID_FILE_NAME_LENGTH = "INVALID FILE NAME LENGTH";
private final String INVALID_FILE_EXTENSION = "INVALID FILE EXTENSION";
private final String INVALID_FILE_SIZE = "INVALID FILE SIZE";

public static void main(String... args) {
    File file = new File("text.pdf");
    Main main = new Main();
    main.validateFileFunctionally(file);
    main.validateFileRegularly(file);
}

private void validateFileFunctionally(File file) {
    BiPredicate<File, Integer> validateFileName = (f, maxLength) -> f.getName().length() < maxLength;
    BiPredicate<File, String> validateExtension = (f, type) -> f.getName().endsWith(type);
    BiPredicate<File, Integer> validateSize = (f, maxSize) -> f.length() <= maxSize;

    BiConsumer<Boolean, String> throwExceptionIfInvalid = (isValid, errorMessage) -> {
        if(!isValid) {
            throw new InvalidFileException(errorMessage);
        }
    };

    throwExceptionIfInvalid.accept(validateFileName.test(file, 20), INVALID_FILE_NAME_LENGTH);
    throwExceptionIfInvalid.accept(validateExtension.test(file, ".pdf") || validateExtension.test(file, ".csv"), INVALID_FILE_EXTENSION);
    throwExceptionIfInvalid.accept(validateSize.test(file, 20), INVALID_FILE_SIZE);
}

private void validateFileRegularly(File file) {
    if (file.getName().length() > 20) {
        throw new InvalidFileException("INVALID FILE NAME LENGTH");
    } else if (!file.getName().endsWith(".pdf") && !file.getName().endsWith(".csv")) {
        throw new InvalidFileException("INVALID FILE NAME LENGTH");
    } else if (file.length() > 20) {
        throw new InvalidFileException("INVALID FILE NAME LENGTH");
    }
}

class InvalidFileException extends RuntimeException {
    public InvalidFileException(String message) {
        super(message);
    }
}
}

最佳答案

哎呀,这恐怕是我的一个小烦恼。不要仅仅因为它是最新的/很酷的东西就试图在各处塞入功能性的东西 - 这只会使你的代码难以阅读并且非常规。 Java 8 函数库只是您可以使用的另一个工具,它允许您在许多情况下编写更清晰、更简洁的代码。您当然不应该专门使用它们。

以您的情况为例 - 链接的 if 语句仍然可能不是实现上述目标的最佳方式,但我可以查看它并在几秒钟内足够准确地了解发生了什么。

与此同时,这个功能示例却相当奇怪。它更长,对于发生的事情不太明显,并且没有提供真正的优势。我看不到任何使用它的案例,如本示例中所写。

关于java - 函数式 java 8 与传统 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996343/

相关文章:

haskell - 是否可以编写一个接受map、reduce或filter并返回它们的 'functionised'版本的函数?

java - 日历提供程序 : Permission Denial on Android 8

java - 从命令行运行时http连接超时

java - 如何仅使用 EasyMock 模拟静态 void 方法?

java - 使用 Java8 将 Map<String, NavigableMap<Long, Collection<String>>> 转换为 List<String>

haskell - 处理 SomeException 被忽略

java - 如何设置从另一个 Activity 检查的单选按钮?

java - 如何在 Java 8 中检查 Stream<String> 是否包含另一个 Stream<String>

java - DrJava:无法使用 JDK8.0 运行代码

javascript - 如何以函数式风格做嵌套的 For 循环