映射返回布尔值的Lambda表达式

时间:2019-04-12 13:14:14

标签: java lambda java-8 functional-interface

我正在尝试将字符串映射到Lambda表达式。表达式接受一个变量(映射),然后返回false或在给定的映射变量上运行getOrDefault。但是由于某种原因,我遇到了错误。

Map<String, Runnable> order_function = new HashMap<>();
order_function.put("AlternativesValues", (Map x) -> { return false; });
order_function.put("AlternativesConstituent", (Map x) -> { x.getOrDefault("orderCloseCons", false); });

3 个答案:

答案 0 :(得分:2)

Runnable不返回任何内容。如果将lambda扩展为匿名类实现,则会看到void是返回类型:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // implementation
    }
};

这与您的lambda> (Map x) -> { return false; }冲突。

由于您需要一个表达式,该表达式采用一个Map,而返回一个boolean,因此您需要Predicate<Map<? ,Boolean>>(保持通配符?或将其替换为所需的内容):

Map<String, Predicate<Map<? ,Boolean>>> order_function = new HashMap<>();
order_function.put("AlternativesValues", x -> false);
order_function.put("AlternativesConstituent", map -> map.getOrDefault("orderCloseCons", false));

答案 1 :(得分:0)

也许您想使用Function而不是Runnable

Map<String, Function<Map<String, Boolean>, Boolean>> order_function = new HashMap<>();
order_function.put("AlternativesValues", x -> false);
order_function.put("AlternativesConstituent", map -> map.getOrDefault("orderCloseCons", false));

//...
boolean alternativesValues = order_function.get("AlternativesValues").apply(someMap);

答案 2 :(得分:0)

如果它们是常量,则可以使用enum,如下所示。

enum OrderFunctions {
    ALTERNATIVES_VALUES("AlternativesValues", map -> false),
    ALTERNATIVES_CONSTITUENT("AlternativesConstituent", map -> map.getOrDefault("orderCloseCons", false));

    private final String name;
    private final Function<Map<String, Boolean>, Boolean> orderFunction;

    OrderFunctions(String name, Function<Map<String, Boolean>, Boolean> orderFunction) {
        this.name = name;
        this.orderFunction = orderFunction;
    }

    public String getName() {
        return name;
    }

    public Function<Map<String, Boolean>, Boolean> getOrderFunction() {
        return orderFunction;
    }

}

,您可以按以下方式使用它。

OrderFunctions.ALTERNATIVES_CONSTITUENT.getOrderFunction().apply(someMap);