2014-03-27 30 views
2

鑑於我有以下的結構已經存在:如何在靜態助手類中聲明函數接口?

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

要手動將其轉換爲運營商,但它確實長相醜陋。但是,如果我提供這兩種方法,是否會在代碼庫上創建不需要的方法爆炸?

回答

0

如果保留兩個,那麼incrementAsIntOperator()一個可以寫成

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

告訴我,你的第二個只是第一個更爲特殊的版本。

我會保留第一種方法,因爲那個更可重用,並且擺脫第二種方法。

提供兩者是否給你提供「不想要的方法爆炸」是否真的取決於你。除此之外,我看不出它的任何缺點。當然你也可以用這個:

​​
相關問題