И 4 раз про русский язык. В русском языке, есть устоявшееся выражение, англицизм, «коллбек», означающий не «обратный вызов», а саму ф-цию, которая вызывается. То, как переводится «call back» не ты один знаешь, уж поверь. Но язык — это такая штука, которую нужно понимать, тут зубрежкой и дословными переводами из вловарей не обойлешься, айм сорри, бейби.
У жаба кодеров травма от долгого кодинга на жабе. Сначала они несколько лет доказывали, что фичи, которых нет в жабе, не нужны, а теперь у них когнитивный диссонанс.
Можно-то можно, но вот следует ли? Я анонимные функции и то не сильно люблю, а уж писать колбеки на лямбдах, это вообще пец получится.
На вкус и цвет фломастеры разные, мне с лямбдами больше нравится.
А вообще я полгода-год наверное назад создавал тут тему про лямды, яву и фп с примерами. Так там мнения разделились практически ровно пополам, кто то вопил что это лютый говнокод, кому то наоборот нравилось.
Пример оттуда уже не вспомню, но вот пример из свежего кода, по поводу которого был спор с коллегами:
public DrugCenterTreeElement accessibleTree() {
List<DrugCenter> dcsPlain = dcr.userAccessible();
return fillChildren(
dcsPlain.stream()
.filter(_dc -> Objects.equals(_dc.getId(), currentUser().getEmployee().getDrugCenterId()))
.findFirst()
.orElseThrow(() -> {
log.error("=====> Drugcenter Id[{}] not found for User[{}] but is set in it's employee information.",
currentUser().getEmployee().getDrugCenterId(), currentUser().getLogin());
return new ExpectedException(getMessage("drugcenter.cannot_find_for_user"));
}),
dcsPlain);
}
protected DrugCenterTreeElement fillChildren(DrugCenter root, List<DrugCenter> dcsPlain) {
return new DrugCenterTreeElement(
root,
dcsPlain.stream()
.filter(_dc -> _dc.getParent().isPresent() && Objects.equals(_dc.getParent().get().getId(), root.getId()))
.map(_dc -> fillChildren(_dc, dcsPlain))
.collect(toList()));
}
Мда... Что только доказывает что лямбдами из любого языка можно сделать нетипизированное скриптовое говно.
И я ничего не имею против нетипизированных скриптовых языков, я например очень даже люблю питон. Но только все хорошо к месту. А брать джаву и превращать ее в ЭТО? Зачем?
Ну так dcsPlain же, от которого мы делаем stream().filter() имеет тип List<DrugCenter>. Поэтому _dc будет иметь тип DrugCenter. Т.к. у фильтра сигнатура: Stream<T> filter(Predicate<? super T> predicate)
В общем отсутствием типов и не пахнет, добавили лишь частичный их вывод для лямбд.
Функции обратного вызова можно реализовать во многих языках, а WinAPI и вовсе где их только не использует. И про то как в питоне совсем нет функций обратного вызова и асинхронности на них:1,2
Я бы сказал вообще в любом. Что-то сходу даже не вспомню не эзотерический язык, где нельзя в функцию передать ссылку/указатель на другую функцию или как в Java объект реализующий интерфейс с 1 функцией, что по сути почти идентично ссылке на функцию.