Java:not-void方法作为map值

时间:2016-08-03 10:57:12

标签: java dictionary methods interface functional-programming

我有一些像这样的代码:

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,因此我无法从中获取值。有没有办法做到这一点?

2 个答案:

答案 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;
    }
}