几周以来我一直在尝试使用 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/