Doing anonymous functions in Java is painful.
The same is true for concurrency.
Jave only recently got a REPL, with Java 9, and if you are working on an existing software platform, the chances you have access it Java 9 are small.
The JVM isn't bad ... But it's a memory hog, and I'm having a lot of fun and continually impressed learning about the erlang virtual machine. When compared to an imperative language, the JVM is definitely fast, so that's good.
You said you have used Java for the past 10 years ... I noticed you didn't compare it to any other languages, communities or development ecosystems...
Java 8 did add anonymous functions. Unfortunately, bolting features like this onto Java results in a "yes we can do this, but it feels really icky because the language wasn't designed to support this. Not really." kind of experience. It's very noticeable for anyone coming to Java who has experience in a language that was designed to support lambdas.
While I haven't really used Kotlin, a quick web search comes up with examples that show it reduces the boilerplate code by 40%:
Another disappointment (I have) with Java's implementation with anonymous functions is their incompatibility with Checked Exceptions. Again this is a result of Java adding features it wasn't designed to do.
Just 2 weeks ago I had to refactor some code a developer wrote with the Streams API and anonymous functions because we encountered a need to depend on code that relied on CheckedExceptions - and it wasn't practical or feasible to rewrite it at this time.
Java is an Okay language. My only point is that I don't find it "productive" or "developer friendly" compared to the other languages out there, especially the newer ones.
The other reasons listed in this article aren't targeted at me, because I've not used C professionally and had to deal with memory management in one of those older languages. That being said, the other newer languages on the market also handle this stuff - it's not a unique value add Java brings in the current market.
"Multi threading is a hard effort."
I'll agree with that. If you're really interested in concurrent and fault tolerant systems Elixir or erlang are worth checking out.
The erlang virtual machine supports the actor model as a foundational design and is time tested. They both enforce immutable data structures as well.
Go and Kotlin also tout abstractions that make it easier to deal with concurrency.
As someone that uses Java daily, I'm just saying - I don't see it. I don't see why it's so special anymore. It was special and useful and productive at a certain time period, but in my opinion, that period is gone.
There are better Java's than Java and there are plenty of other alternative modern languages that are very well designed.
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.