我正在尝试将字符串映射到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); });
答案 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);