当前位置: 首页 > 知识库问答 >
问题:

如何使lambda表达式在Java8中定义toString?

柳钟展
2023-03-14
public class LambdaToStringTest {

    public interface ToStringInterface {
        public abstract String toString();
    }

    public static void main(String[] args) {
        print("TRACE: %s", (ToStringInterface)()->someComputation()); // <<-- ERROR: The target type of this expression must be a functional interface
    }

    private static void print(String format, Object... args) {
        System.out.println(String.format(format, args));
    }

}

如果我更改了方法的名称,它会进行编译,但它不会重写toString,因此print方法不会打印预期的内容。

这是试图定义一个日志子系统,该子系统仅在需要时(当它真的要打印时)对lambda求值,但与非lambda参数兼容。我知道其他的方法来实现它,但我想知道为什么我不能这样做,如果有一个变通办法或我做错了什么,

共有1个答案

范承教
2023-03-14

简短的回答,你不能。@functionalinterface%s不能用于“重写”object中的方法。

但是,您可以使用虚拟扩展方法实现formattable。注意:以下代码未经测试:

@FunctionalInterface
public interface ToStringInterface
    extends Formattable
{
    String asString();

    @Override
    default void formatTo(Formatter formatter, int flags, int width, int precision)
    {
        formatter.format("%s", this);
        // Or maybe even better:
        formatter.out().append(this.asString());
    }
}

我之所以提出这个解决方案,是因为您使用的是string.format(),它利用了这个接口。

 类似资料:
  • 问题内容: 我不想让普通的lambda实现方法并将其toString重新定义为附加值。我希望lambda表达式仅实现toString方法。我知道我的表达不太好,但是我相信您会通过此示例理解我。 如果我更改了方法的名称,它将进行编译,但是它不会覆盖toString,因此print方法将不会输出期望的结果。 这是尝试定义一个日志子系统,该子系统仅在需要时(真正要打印时)评估lambda,但与非lamb

  • 1 Java8 Lambda表达式的介绍 Lambda表达式是Java8中包含的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在Collection集合中非常有用。它有助于集合元素的迭代,过滤和从集合中提取数据。 Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用Lambda表达式的情况下,我们无需再次定义用于提供实现的方法。我们只编写实现代码

  • 我在尝试使用lambda表达式时遇到了这个错误。

  • 我最近接触了Java8,我正在尝试学习Lambda表达式。我想做一些图形计算,我的代码到目前为止: 所有这些代码都是用于图形的,除了和使用的操作之外,所有内容都是基本的数学(加、减、乘、模),并且可以单独针对每个像素执行。 现在的问题是:有可能在GPU上运行这个吗?或者这甚至是自动基于GPU的?(我记得在什么地方读到过这个,但我不确定)

  • 我怎样才能用Java8做到这一点呢?

  • 问题内容: 我正在研究使用Beanshell env进行产品自定义挂钩的产品(在Tomcat中运行的Sailpoint IdentityIQ)。我想编写一些代码来解析大型csv文件,并希望利用Java 8 Streams。但是我面对Beanshell env引发错误的问题,尽管我们正在使用Java 8,但无法识别Lambda表达式 有什么方法可以告诉beanshell识别lambda或代码中的转义