In Obj-C, Code Blocks are an awesome way to un-spaghetti-fy source code by doing away with protocols.
Translate that to Java:
In Java, Lambdas are an awesome way to un-spaghetti-fy source code by doing away with interfaces.
In Obj-C, we've been able to clean up and streamline our code a lot using completion blocks. But as with any technique, you can be an idiot using it. It's all about proper usage. Knowing when to eat your spag and when to eat the meat balls.
Disclaimer: I work for Oracle, using native iOS tools & languages. Our project embeds some HTML server-provided pages, connects to the server using server-side service calls all written in Java. I have no opinion on anyone's dislike of the company. But from the inside, it's not trying to be fundamentally evil. But then again, I'm not a paying customer.