В Java 8 есть новые методы в Map
, которые вы можете использовать с лямбдами для решения этой проблемы. Первый вариант, compute
:
a.compute(key, (k, v) -> v+1);
Обратите внимание, что это работает только в том случае, если хэш инициализируется для всех возможных ключей.
Если это не гарантировано, вы можете изменить приведенный выше код на:
a.compute(key, (k, v) -> v == null ? 1 : v + 1);
Или использовать метод merge
(который я бы предпочел):
a.merge(key, 1, (a, b) -> a + b);
Может быть, есть более лямбда-методы, о которых я не знаю.
if
A =:= B ->
expr1;
true ->
expr2
end
или
case A =:= B of
true -> expr1;
false -> expr2
end
, или
case A of
B -> expr1;
_ -> expr2
end
, или
foo(A,B), ...
...
foo(X,X) -> expr1;
foo(_,_) -> expr2.
if
a == b ->
expr1;
true ->
exprElse
end
В Erlang нет ничего другого, вы просто сопоставьте с истиной. Дополнительную информацию можно найти в документации Erlang .
Вы должны обратить пристальное внимание на символы ';' терминатор:
if
a == b ->
clauseN,
expr1;
cond2 ->
clause1,
clause2,
expr2;
cond3 ->
expr3;
true ->
exprElse
end
Это не дружественный к копипасту язык.
Сопоставление с образцом - одна из многих сильных сторон Erlang, и его часто можно использовать вместо операторов if. Часто удобнее использовать сопоставление с образцом в аргументах функции или выражение case (которое также является сопоставлением с образцом).
Предположим, у вас есть функция some_function
, которая принимает два аргумента. Если аргументы равны, вы оцениваете выражение1, в противном случае вы оцениваете выражение2. В erlang это можно выразить как:
some_function(A, A) -> expression1;
some_function(A, B) -> expression2.
Поразительно, сколь многого можно достичь с помощью такого простого сопоставления с образцом. С помощью защитных предложений вы можете выражать более сложные шаблоны, например,
some_function(A, B) when A < B -> expression3.
Другая возможность - использовать case .. выражения
.
Другой вариант:
case a of
b -> expr1; %% true
_ -> expr2 %% false
end.