Я смог сделать это в 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?
Я смог сделать это в 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?
Вы можете использовать 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);
Как уже было сказано @Boris the Spider и @Holger в комментариях, Лучше использовать 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)));
Создайте себе красивое, типичное, 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;