我可以给 lambda 起个名字吗?

问题描述 投票:0回答:2

我有大致下一个形状的很好的功能代码(

ComponentRegistry.java
):

public void doExport() {
    config.exports().forEach((key, type) -> {
        ...
    }
}

它的问题是,当涉及到 log4j 语句时,它会产生下一个输出:

ComponentRegistry lambda$doExport$1

实际方法名称位于“lambda”关键字之后,然后有两个关于匿名类的提示(

$
)。它根本不如直接方法调用日志记录。

我想知道是否有人想出了在 log4j 输出或堆栈跟踪中正确标记 lambda 的方法,因为这太棒了。

java lambda java-8
2个回答
13
投票

如果你想给它一个名字,不要使用 lambda(它明确是一个 anonymous 函数)。相反,将其分解为自己的类。


0
投票

我同意关于 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(...))
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.