【问题标题】:How to declare Functional Interfaces in static helper classes?如何在静态帮助类中声明功能接口?
【发布时间】:2014-03-27 08:23:12
【问题描述】:

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

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

手动将其强制转换为操作员,但它确实看起来很难看。但是,如果我同时提供两者,它是否会在代码库上创建不需要的方法爆炸?

【问题讨论】:

    标签: java helper java-8 functional-interface


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2018-05-01
      • 1970-01-01
      • 2010-09-06
      • 2014-11-09
      相关资源
      最近更新 更多