While operator overloading can be used for good, it is far more often used to create huge messes. It makes the simplest expressions impossible to understand locally because now, everywhere there is an operator, you cannot be sure what is actually going on. IMO, operator overloading is evil, despite the good intentions.
I hear you about type erasure for generics.
Lambda statements in Java are a recent addition. But I hear you about first class functions. There are a lot of other languages that run on the JVM platform and are interoperable with Java. And many of these have first class functions. JavaScript (Nashorn), Clojure (a modern lisp with concurrency and immutable structures), Groovy, Scala and many others. And the interoperability is very real -- because they all pass around the very same underlying types and objects from the underlying runtime system.
I hear you about lack of properties and the annoyance of getters/setters. IDEs help, but its not the same thing. (like kissing your boyfriend through a veil)