Отображение лямбда-выражений, возвращающих логические значения - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь сопоставить строку с лямбда-выражениями. Выражения принимают переменную (map) и либо возвращают 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 ]

2 голосов
/ 12 апреля 2019

Runnable ничего не возвращает.Если вы развернете лямбду до реализации анонимного класса, вы увидите, что void - это тип возвращаемого значения:

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

Это противоречит вашей лямбде> (Map x) -> { return false; }.

Поскольку вам нужно выражение, которое принимает a Map и возвращает a 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));
0 голосов
/ 13 апреля 2019

Если они означают постоянные, вы можете использовать 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);
0 голосов
/ 12 апреля 2019

возможно, вы хотели использовать 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);
...