Дизайн API и языковые функции определенно взаимозаменяемы в некоторых моментах. Просто посмотрите на что-то вроде синхронизированного ключевого слова в Java. Это ключевое слово, но оно также может быть реализовано как API, если язык достаточно не многословен. Аннотации являются еще одним примером. Другой способ обойти аннотацию @Stateless, которая делает все методы в классе транзакций, также мог бы быть ключевым словом языка.
В частности, замыкания позволяют легко передать «блок кода» методу, который затем может что-то с этим сделать.
Можно сделать грубый пример, для каждого:
for_each(myFooList, #(Foo foo) {
String something = foo.getBar() + foo.getKaz();
System.out.println(something);
});
Возможно, не на 100% чистее, чем наличие для каждого цикла, напрямую поддерживаемого синтаксисом языка, но это позволяет каждому легко испытать языковые улучшения.