如何在静态助手类中声明功能接口?

时间:2014-03-27 08:23:13

标签: java helper java-8 functional-interface

鉴于我已经存在以下结构:

private void acceptInner(final Path path) throws IOException {
    String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
        idString -> String.valueOf(Integer.parseInt(idString) + 1));
    BaseUtils.moveKeepExtension(path, StageRename.OUTPUT_DIRECTORY, newId);
}

FileUtils.readAndModifyFileEntry声明为:

public static String readAndModifyFileEntry(final Path path, final String entryKey 
    , final UnaryOperator<String> operator) throws IOException { ... }

现在我想将一个字符串值增加一个整数的运算符移动到一个新的帮助类,我提出了两个建议:

final public class MapperUtils {
    private MapperUtils() {
        throw new UnsupportedOperationException();
    }

    public static String incrementAsInt(final String input) {
        return String.valueOf(Integer.parseInt(input) + 1);
    }

    public static UnaryOperator<String> incrementAsIntOperator() {
        return input -> String.valueOf(Integer.parseInt(input) + 1);
    }
}

哪一个会更好,用法如下:

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id",
    MapperUtils::incrementAsInt);

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
    MapperUtils.incrementAsIntOperator());

或者我应该保留两者吗?

后者的一个优点是我可以使用andThen()compose()来链接运算符,但它有什么缺点吗?

如需更多参考,我可以使用以下内容:

((UnaryOperator<String>)MapperUtils::incrementAsInt).andThen(/*something*/)

要手动将其投射到操作员,但它看起来真的很难看。但是,如果我同时提供它们,那么它是否会在代码库上创建不需要的方法爆炸?

1 个答案:

答案 0 :(得分:0)

如果同时保留两者,那么incrementAsIntOperator()可以写为

public static UnaryOperator<String> incrementAsIntOperator() {
    return input -> incrementAsInt(input);
}

这告诉我你的第二个只是第一个更专业的版本。

我会保留第一种方法,因为那种方法更可重复使用,并摆脱第二种方法。

是否提供两者都会给你带来“不必要的方法爆炸”,这取决于你。除此之外,我看不出它的任何缺点。当然你也可以使用它:

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
    input -> MapperUtils.incrementAsInt(input));