我有大致下一个形状的很好的功能代码(
ComponentRegistry.java
):
public void doExport() {
config.exports().forEach((key, type) -> {
...
}
}
它的问题是,当涉及到 log4j 语句时,它会产生下一个输出:
ComponentRegistry lambda$doExport$1
实际方法名称位于“lambda”关键字之后,然后有两个关于匿名类的提示(
$
)。它根本不如直接方法调用日志记录。
我想知道是否有人想出了在 log4j 输出或堆栈跟踪中正确标记 lambda 的方法,因为这太棒了。
如果你想给它一个名字,不要使用 lambda(它明确是一个 anonymous 函数)。相反,将其分解为自己的类。
我同意关于 lambda 的其他答案,如果需要名称,则 lambda 不一定是正确的方法。
我遇到的一个例外是在测试时使用
Supplier
。有时,为了推迟代码从 MethodSource
/ArgumentSource
/等运行,这可能是必要的。在 JUnit 参数化测试中。 JUnit 5 有一个可供您使用的 Named
界面。我创建了类似以下示例的内容,以使我的案例具有有意义的名称:
public class NamedSupplier<T> implements Supplier<T>, Named<NamedSupplier<T>> {
private final String name;
private final Supplier<T> supplier;
private NamedSupplier(String name, Supplier<T> supplier) {
this.name = name;
this.supplier = supplier;
}
public static <T> NamedSupplier<T> from(String name, Supplier<T> supplier) {
return new NamedSupplier<T>(name, supplier);
}
@Override
public T get() {
return supplier.get();
}
@Override
public String getName() {
return name;
}
@Override
public NamedSupplier<T> getPayload() {
return this;
}
}
用途:
public static Stream<NamedSupplier<SomeModel>> someMethodSource() {
return Stream.of(
NamedSupplier.from("Name A", () -> fetchData(...)),
NamedSupplier.from("Name B", () -> fetchData(...))
);
}