java中具有多个OR的if条件的更好方法是什么?最好使用Java8

时间:2018-09-07 21:09:53

标签: java conditional

如何更好地做到这一点?我更喜欢java8语法。

这些布尔条件可能会增长。

boolean imageType = filetype.startsWith("image");

boolean videoType = filetype.startsWith("video");

boolean archiveType = filetype.contains("archive");

boolean jarType = filetype.contains("java-archive");

boolean audioType = filetype.startsWith("audio");

boolean zipType = filetype.contains("zip");

boolean xTarType = filetype.contains("x-tar");

boolean rarType = filetype.contains("rar");

if(!(imageType || videoType || archiveType || jarType || audioType || zipType || xTarType)) {
         //doSomething         
}

3 个答案:

答案 0 :(得分:1)

也可以使用面向对象的方法为您提供有关文件类型的更多信息。我可以想象它稍后在您的程序中会很有用。

您可以执行类似在Enum中声明所有文件类型的操作:

public enum FileType {
    IMAGE("a"),
    VIDEO("b"),
    ARCHIVE("c"),
    JAR("d"),
    AUDIO("e"),
    ZIP("f"),
    XTAR("g");

    private String str;

    FileType(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }

    public static FileType getFileTypeForStr(String str) {
        for (FileType fileType : FileType.values()) {
            if (fileType.getStr().equalsIgnoreCase(str)) {
                return fileType;
            }
        }

        return null;
    }
}

然后,在您的函数中,可以将所有Booleans替换为检查以查看您的输入String1是否包含在文件中:

FileType fileType = FileType.getFileTypeForStr(String1); //And String2, String3, String4...
if (fileType != null) {
    System.out.printf("File type found of type %s", fileType.name());
} else {
    System.out.printf("No file type found for input %s", String1);
}

由于要检查7个不同的字符串,因此可以添加一个简单的检查来查看所有String1变量是否匹配:

boolean isNotFileType = Stream
    .of(String1, String2, String3, String4, String5, String6, String7)
    .map(FileType::getFileTypeForStr)
    .anyMatch(Objects::isNull);

答案 1 :(得分:0)

1)在Predicate s中重新组合条件。以枚举为例:

public enum PredicateEnum {

    IMAGE   (filetype -> filetype.startsWith("image")),
    VIDEO   (filetype -> filetype.startsWith("video")),
    ARCHIVE (filetype -> filetype.contains("archive")),
    JAR     (filetype -> filetype.contains("java-archive")),
    AUDIO   (filetype -> filetype.startsWith("audio")),
    ZIP     (filetype -> filetype.contains("zip")),
    X_TAR   (filetype -> filetype.contains("x-tar")),
    RAR     (filetype -> filetype.contains("rar"));

    private Predicate<String> predicate;

    PredicateEnum(Predicate<String> predicate) {
        this.predicate = predicate;
    }

    public Predicate<String> getPredicate() {
        return predicate;
    }
}

2)使用Stream#reducePredicate#or创建单个谓词,该谓词是通过逻辑OR运算符连接的所有谓词的结果:

Predicate<String> predicateOr = Stream.of(PredicateEnum.values())
        .map(PredicateEnum::getPredicate)
        .reduce(Predicate::or)
        .orElse(s -> false);

System.out.println("image.png: "      + predicateOr.test("image.png"));
System.out.println("my-archive.txt: " + predicateOr.test("my-archive.txt"));
System.out.println("foo : "           + predicateOr.test("foo"));

3)在您的if语句中使用Predicate#test的结果。例如,上面的代码将输出:

image.png: true
my-archive.txt: true
foo : false

答案 2 :(得分:0)

这里有两种方法可以使它更“可扩展”。

  1. 使用正则表达式:

    Pattern p = Pattern.compile("^video|^audio|^image|zip|rar|java-archive|x-tar");
    if (!p.matcher(filetype).find()) {
        // do stuff
    }
    
  2. 使用数组或列表。例如:

    String[] prefixes = new String[]{"video", "audio", "images"};
    String[] contains = new String[]{"zip", "rar", "x-tar", "jar-archive"};
    boolean match = false;
    for (String p : prefixes) {
        if (filetype.startsWith(p)) {
            match = true;
        }
    }
    ...
    if (!match) {
        // do stuff
    }
    

显然,正则表达式方法更简洁,但数组方法可能更有效(如果那很重要!)。这取决于正则表达式引擎如何应对具有很多替代方案的正则表达式。

两种方法都会扩展;例如,通过更新正则表达式或向数组添加字符串。

在两种情况下,您都可以轻松地从属性文件或类似文件中加载相关条件,并避免进行代码更改。

我不认为Java 8 lambda和流是否适合此问题。