Java 我想缩短这个方法,你能帮我吗?

Java 我想缩短这个方法,你能帮我吗?,java,Java,我想用一种更短的方式写这个方法。你有什么想法吗?我没有得到运行的东西 public static AudioFile getInstance(String pathname) { String ending = null; int auxvar = pathname.lastIndexOf('.'); if (auxvar<0) { throw new RuntimeException("Unknown suffix for AudioFile:

我想用一种更短的方式写这个方法。你有什么想法吗?我没有得到运行的东西

public static AudioFile getInstance(String pathname) {
    String ending = null;
    int auxvar = pathname.lastIndexOf('.');

    if (auxvar<0) {
        throw new RuntimeException("Unknown suffix for AudioFile: \""+ pathname + "\"");
    }else {
        ending = pathname.substring(auxvar+1);
        ending = ending.toLowerCase();
        if (ending.equalsIgnoreCase("wav")) {
            return new WavFile(pathname);
        }else if (ending.equalsIgnoreCase("mp3") || ending.equalsIgnoreCase("ogg")) {
            return new TaggedFile(pathname);
        }else {
            throw new RuntimeException("Unknown suffix for AudioFile: \" "+ pathname + "\" ");
        }
    }
}

公共静态音频文件getInstance(字符串路径名){
字符串结尾=null;
int auxvar=pathname.lastIndexOf('.');

如果(auxvar好的,如果您需要该代码,但要短一些:

public static AudioFile getInstance(String path) {
    String pathc = path.toLowerCase();
    if (pathc.endsWith(".wav")) return new WavFile(path);
    if (pathc.endsWith("mp3") || pathc.endsWith(".ogg")) return new TaggedFile(path);
    throw new IllegalArgumentException("Unknown suffix for AudioFile: \""+ path + "\"");
}

做同样的事情。

好吧,如果你想要那段代码,但要短一些:

public static AudioFile getInstance(String path) {
    String pathc = path.toLowerCase();
    if (pathc.endsWith(".wav")) return new WavFile(path);
    if (pathc.endsWith("mp3") || pathc.endsWith(".ogg")) return new TaggedFile(path);
    throw new IllegalArgumentException("Unknown suffix for AudioFile: \""+ path + "\"");
}

做同样的事情。

使用正则表达式的Monad样式解决方案:

final static Pattern audioFilePattern = Pattern.compile(".*\\.(\\w+)");

public static AudioFile getInstance(String path) {
    return Optional.of(path)
        .map(audioFilePattern::matcher).filter(Matcher::matches)
        .map(m -> m.group(1).toLowerCase())
        .filter(s -> Stream.of("wav", "mp3", "ogg").anyMatch(s::equals))
        .map(s -> "wav".equals(s) ? new WavFile(path) : new TaggedFile(path))
        .orElseThrow(() -> new IllegalArgumentException("Unknown suffix for AudioFile: \"" + path + "\""));
}

带正则表达式的Monad样式解决方案:

final static Pattern audioFilePattern = Pattern.compile(".*\\.(\\w+)");

public static AudioFile getInstance(String path) {
    return Optional.of(path)
        .map(audioFilePattern::matcher).filter(Matcher::matches)
        .map(m -> m.group(1).toLowerCase())
        .filter(s -> Stream.of("wav", "mp3", "ogg").anyMatch(s::equals))
        .map(s -> "wav".equals(s) ? new WavFile(path) : new TaggedFile(path))
        .orElseThrow(() -> new IllegalArgumentException("Unknown suffix for AudioFile: \"" + path + "\""));
}

您没有指定当
条件失败时返回什么,我猜您的代码没有编译
公共静态音频文件getInstance(String p){return null;}
--不客气。为什么您认为此代码需要缩短?您没有指定当
条件失败时返回什么,我猜您的代码没有编译
公共静态音频文件getInstance(String p){return null;}
--不客气。为什么您认为这段代码需要缩短?我想这是一个很好的例子,说明了为什么所有这些新的lambda代码通常更难遵循(代码可以采用更多的代码和更隐式的路径)、效率更低(速度会更慢)和灵活性更低(lambda不是控制流、可变局部变量或检查异常透明)。lambda很有用。但是使用正确的工具和所有这些。这不是应该使用的代码类型。我想这是一个很好的例子,说明了为什么所有这些新的lambda代码通常都很难遵循(代码可以使用更多的代码和更多的隐式路径)、效率更低(速度会更慢)和灵活性更低(lambda不是控制流、可变局部变量或检查异常透明)。lambda很有用。但是使用正确的工具和所有这些工具。这不是应该使用的代码类型。