Lambdas are far more useful than simply abstracting loops, which are an abstraction itself. You can actually pass in code to other methods so you don't have to use retardation like Comparable and Comparator to endlessly repeat yourself for each search or sort you want to perform that differs from the default implementation. At least interfaces can have implementation, that is a small improvement.
In Ruby because C# makes me feel dirty:
array.sort #default sort
array.sort {|l,r| rl} # reverse sort, pretending that reverse doesn't exist
array.sort{|l,r| l.some_valr.some_value}
Pre-Java 8, that was a painful thing to do. More usefully you can now use lambdas instead instead of the nasty boilerplate of anonymous classes to clean up your code for things like listeners.
Spend some time in Scala or JRuby and find out that you can do a lot, cleanly, concisely, easy to maintain and in a tenth of the LOC that Java requires. It will make your Java code better.
And no Java generics suck because of type erasure leading to this senselessness:
ArrayList myStrings = new ArrayList();
...
String tmp = (String)myStrings.get(0);
What a joke.
There are tools in IDE's to take care of the boilerplate but it still exists and still needs to be maintained.
What cracks me up are Java accessors and mutators that don't do any thing other than store and retrieve a value.
public void setIdiocy(SomeType idiot) {
this.idiot=idiot;
}
Just make the fields public, it is the same thing.