Как перебрать лямбда-функции в Java - PullRequest
0 голосов
/ 25 августа 2018

Я смог сделать это на Python, и мой код Python:

signs = {"+" : lambda a, b : a + b, "-" : lambda a, b : a - b}

a = 5
b = 3
for i in signs.keys():
    print(signs[i](a,b))

И вывод:

8
2

Как мне сделать то же самое в Java черезHashMap?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Создайте себе хороший, типизированный, enum:

enum Operator implements IntBinaryOperator {
    PLUS("+", Integer::sum),
    MINUS("-", (a, b) -> a - b);

    private final String symbol;
    private final IntBinaryOperator op;

    Operator(final String symbol, final IntBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    public String symbol() {
        return symbol;
    }

    @Override
    public int applyAsInt(final int left, final int right) {
        return op.applyAsInt(left, right);
    }
}

Возможно, вы захотите лямбду, которая возвращает double вместо int для других операторов.

Теперь,просто сбросьте это в Map:

final var operators = Arrays.stream(Operator.values())
        .collect(toMap(Operator::symbol, identity()));

Для вашего примера, вам вообще не нужен Map:

Arrays.stream(Operator.values())
        .mapToInt(op -> op.applyAsInt(a,b))
        .forEach(System.out::println);

Использование:

import static java.util.function.Function.identity;
import static java.util.stream.Collectors.toMap;
0 голосов
/ 25 августа 2018

Вы можете использовать BinaryOperator<Integer> в этом случае следующим образом:

BinaryOperator<Integer> add = (a, b) -> a + b;//lambda a, b : a + b
BinaryOperator<Integer> sub = (a, b) -> a - b;//lambda a, b : a - b

// Then create a new Map which take the sign and the corresponding BinaryOperator
// equivalent to signs = {"+" : lambda a, b : a + b, "-" : lambda a, b : a - b}
Map<String, BinaryOperator<Integer>> signs = Map.of("+", add, "-", sub);

int a = 5; // a = 5
int b = 3; // b = 3

// Loop over the sings map and apply the operation
signs.values().forEach(v -> System.out.println(v.apply(a, b)));

Выходы

8
2

Примечаниедля Map.of("+", add, "-", sub); Я использую Java 10. Если вы не используете Java 9+, вы можете добавить на карту примерно так:

Map<String, BinaryOperator<Integer>> signs = new HashMap<>();
signs.put("+", add);
signs.put("-", sub);

Ideone demo


Хорошая практика

Как уже сказано @ Борисом Пауком и @ Хольгером в комментариях, лучше использовать IntBinaryOperator, чтобы избежать бокса,в конце ваш код может выглядеть так:

// signs = {"+" : lambda a, b : a + b, "-" : lambda a, b : a - b}
Map<String, IntBinaryOperator> signs = Map.of("+", (a, b) -> a + b, "-", (a, b) -> a - b);
int a = 5; // a = 5
int b = 3; // b = 3
// for i in signs.keys(): print(signs[i](a,b))
signs.values().forEach(v -> System.out.println(v.applyAsInt(a, b)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...