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