簡體   English   中英

Java:在Handler.setFormatter中使用Lambda表達式

[英]Java: use lambda expression in Handler.setFormatter

我在代碼(java.util.logging)中使用了Logger,我創建了一個Handler以添加到記錄器中。我想在此Handler上設置Formatter,我可以使用匿名內部類來做到這一點,但我想替換該類帶有lambda表達式。 我不知道該怎么做。 有什么建議么?

工作代碼:

public static Logger logger = Logger.getLogger("KYCReviewSchedule");
Handler INFOHandler = new FileHandler(OUTPUTDIR + "INFO_logger.txt",true);

INFOConsoleHandler.setFormatter(new SimpleFormatter() {
    private static final String format = "[%1$tF %1$tT] [%2$-7s] %3$s %n";
    public String format(LogRecord lr) {
        return String.format(format,new Date(lr.getMillis()),
            lr.getLevel().getLocalizedName(),lr.getMessage())

    }
});

我想用lambda表達式代替最后一條語句:

 INFOConsoleHandler.setFormatter(
    (lr)->  String.format("[%1$tF %1$tT] [%2$-7s] %3$s %n",
    lr.millis(),lr.getSourceMethodName(), lr.getLoggerName() , 
    lr.getLevel(), lr.getMessage() , lr.getThrown())
);

您可以使用適配器方法將lambda轉換為SimpleFormatter但需要一個功能接口:

import java.util.logging.LogRecord;

@FunctionalInterface
public interface LogFormatter {
    public String format(LogRecord lr);
}

適配器方法如下所示:

public static SimpleFormatter simpleFormat(LogFormatter formatter) {
    return new SimpleFormatter() {
        public String format(LogRecord lr) {
            return formatter.format(lr);
        }
    };
}

然后可以像這樣調用它:

INFOConsoleHandler.setFormatter(simpleFormat(
    lr -> String.format("[%1$tF %1$tT] [%2$-7s] %3$s %n",
        lr.millis(), lr.getSourceMethodName(), lr.getLoggerName(), 
        lr.getLevel(), lr.getMessage() , lr.getThrown())
));

如果這是唯一的地方,它不會提供任何優勢,但是,如果要在代碼中的許多地方創建格式化程序,而更喜歡使用lambda進行定義,那是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM