Java 如何使用返回get的toString创建供应商?

Java 如何使用返回get的toString创建供应商?,java,Java,我想让映射值解析变得懒惰,所以我考虑向供应商提供一个toString函数。但下面的代码无法编译: 默认方法无法重写java.lang.Object中的方法 有人知道如何巧妙地解决这个问题吗 @FunctionalInterface private static interface ToStringSupplier extends Supplier<String> { default public String toString() { return get()

我想让映射值解析变得懒惰,所以我考虑向供应商提供一个toString函数。但下面的代码无法编译:

默认方法无法重写java.lang.Object中的方法

有人知道如何巧妙地解决这个问题吗

@FunctionalInterface
private static interface ToStringSupplier extends Supplier<String>
{
    default public String toString() {
        return get();
    }
}
致:

之后,我可以将实现更改为惰性方法:

发件人:

致:

供应商()->费用计算();
地图放置(钥匙、供应商);

默认值是在switch语句中使用的保留字


您可能想使用抽象的

我发现下面的代码可以很好地解决我的问题:

private static Object getToString(Supplier<String> s) {
    return new Object()
    {
        @Override
        public String toString() {
            return s.get();
        }
    };
}

Supplier<String> supplier = () -> expensiveCalculation();
map.put(key, getToString(supplier));
private静态对象getToString(供应商){
返回新对象()
{
@凌驾
公共字符串toString(){
返回s.get();
}
};
}
供应商=()->费用计算();
map.put(键,getToString(供应商));

正如Louis Wasserman在问题的评论部分所提到的,不可能用
默认值来覆盖实例方法。这可以通过一个新类来完成,该类将
#toString
调用委托给所提供供应商的
#get
方法

以下是如何做到这一点:

import java.util.Map;
import java.util.function.Supplier;

class Scratch {

    public static final class ToStringSupplier implements Supplier<String> {

        private final Supplier<String> supplier;

        public ToStringSupplier(Supplier<String> supplier) {
            if (supplier == null) {
                throw new NullPointerException();
            }
            this.supplier = supplier;
        }

        @Override
        public String toString() {
            System.out.println("Invoked ToStringSupplier#toString.");
            return get();
        }

        @Override
        public String get() {
            System.out.println("Invoked ToStringSupplier#get.");
            return supplier.get();
        }
    }

    public static void main(String[] args) {
        final var supplier = new ToStringSupplier(() -> {
            System.out.println("Invoked Supplier#get.");
            return "The result of calculations.";
        });
        final var key = "key";
        final var map = Map.of(key, supplier);

        System.out.println("The map has been built.");
        final var calculationResult = map.get(key).toString();
        System.out.println(calculationResult);

        System.out.flush();
    }
}

在java 8中,接口中的方法可以是默认的并具有实现OK,我没有使用java 8。它没有回答怎么做,而是为什么:不清楚你的懒惰解决方案有什么要求?在上面的代码中,您只需以惰性方式单独调用get()。让我们知道这段代码是怎么回事。你想通过懒惰的解决方案得到什么?你的问题不清楚。请添加代码,演示您希望如何使用具有映射值的供应商。更新了问题,并解释了为什么/如何需要它。您可以使用抽象类,但不能使用接口。您不能将默认的
toString()
实现附加到lambda。@LouisWasserman:您能给出抽象类解决方案的示例吗?
String value = expensiveCalculation();
map.put(key,value);
Supplier<String> supplier () -> expensiveCalculation();
map.put(key, supplier);
private static Object getToString(Supplier<String> s) {
    return new Object()
    {
        @Override
        public String toString() {
            return s.get();
        }
    };
}

Supplier<String> supplier = () -> expensiveCalculation();
map.put(key, getToString(supplier));
import java.util.Map;
import java.util.function.Supplier;

class Scratch {

    public static final class ToStringSupplier implements Supplier<String> {

        private final Supplier<String> supplier;

        public ToStringSupplier(Supplier<String> supplier) {
            if (supplier == null) {
                throw new NullPointerException();
            }
            this.supplier = supplier;
        }

        @Override
        public String toString() {
            System.out.println("Invoked ToStringSupplier#toString.");
            return get();
        }

        @Override
        public String get() {
            System.out.println("Invoked ToStringSupplier#get.");
            return supplier.get();
        }
    }

    public static void main(String[] args) {
        final var supplier = new ToStringSupplier(() -> {
            System.out.println("Invoked Supplier#get.");
            return "The result of calculations.";
        });
        final var key = "key";
        final var map = Map.of(key, supplier);

        System.out.println("The map has been built.");
        final var calculationResult = map.get(key).toString();
        System.out.println(calculationResult);

        System.out.flush();
    }
}
The map has been built.
Invoked ToStringSupplier#toString.
Invoked ToStringSupplier#get.
Invoked Supplier#get.
The result of calculations.