我有一些像这样的代码:
public class A {
private final Map<String, Runnable> map = new HashMap<>();
public A() {
map.put("a", () -> a());
map.put("b", () -> b());
}
public int a() {
return 1;
}
public int b() {
return 2;
}
public int c(String s) {
// map.get(s).run(); <= returns void, but
// I need the result of the
// function paired to the string.
// What TODO?
}
}
我没有-void函数(a()
,b()
)作为地图的值,与Strings配对。我需要运行函数并获取函数的结果,并在函数c()
中返回它。 run()
函数返回void
,因此我无法从中获取值。有没有办法做到这一点?
答案 0 :(得分:6)
您要在此处执行的操作是从方法返回int
值。为此,您无法使用Runnable
,因为run()
不会返回值。
但您可以使用IntSupplier
,它是一个功能接口,表示提供int
值的函数。其功能方法getAsInt
用于返回值。
public class A {
private final Map<String, IntSupplier> map = new HashMap<>();
public A() {
map.put("a", () -> a()); // or use the method-reference this::a
map.put("b", () -> b()); // or use the method-reference this::b
}
public int a() {
return 1;
}
public int b() {
return 2;
}
public int c(String s) {
return map.get(s).getAsInt();
}
}
此外,如果您不想返回原语但需要返回对象MyObject
,则可以使用Supplier<MyObject>
功能界面(或Callable<MyObject>
如果要调用的方法可以抛出一个检查过的例外)。
答案 1 :(得分:0)
lambdas是新的这一事实并不意味着它们对于每个(可能是任何)解决方案都是必需的。考虑一下这种经过验证的java 5特性(一种叫做枚举对象的东西)。
public class Enumery
{
private static enum Stuffs
{
a(1),
b(2);
Stuffs(final int value)
{
this.value = value;
}
public int kapow()
{
return value;
}
final int value;
}
public int thing(final String stuffsName)
{
final int returnValue;
final Stuffs theStuffs;
theStuffs = Stuffs.valueOf(stuffsName);
returnValue = theStuffs.kapow();
return returnValue;
}
}