java - 如何在静态帮助类中声明功能接口(interface)?

标签 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*/)

要手动把它转给一个运算符(operator),但它真的很难看。但是,如果我同时提供两者,它是否会在代码库上创建不需要的方法爆炸?

最佳答案

如果两者都保留,则 incrementAsIntOperator() 可以写成

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

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

我会保留第一种方法,因为它的可重用性更高,而放弃第二种方法。

是否同时提供两者都会给您带来“不需要的方法爆炸”,这完全取决于您。除此之外,我看不出它有什么缺点。当然你也可以使用这个:

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

关于java - 如何在静态帮助类中声明功能接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681885/

相关文章:

java - 如何处理 Java 8/JSR 310/threeten.org 中 ISO-8601 时间戳中的 'optional' T?

java-8 - 最新的 JDK 8 Build 40 从 Nashorn 引擎返回间歇性异常

java - 使用 Java 更改 xml-node 的节点名称

java - 由于分析错误,Sonarlint 未处理文件

java - 使用专门类型进行 Scala 优化 : sum with longs

java - 我的代码没有正确执行 if 语句

输入选择表单上的 CakePHP 标签选项未按预期工作

html - CSS : Automatic width variable calculation

java-8 - java防止了很多if并用设计模式替换它

ruby-on-rails - 减少 Rails 路由和 url 助手中的冗余