Java for Everything
There's the language and there's the ecosystem. A lot of negative feelings that still linger are, IMHO, directed more at some of the painful historical aspects of the ecosystem: J2EE XML configuration hell, EJBs, bloated application servers, XML for everything, JAX-WS, SOAP, ant, classloader problems, maven dependency hell, 10 different logging libraries, etc... A lot of this stuff truly sucked.<p>But I feel things have improved over time. Dropwizard, gradle, embedded jetty, jersey, guava, Spring boot, etc... The trend is towards minimizing configuration and overall, the ecosystem has become somewhat more manageable. I wouldn't necessarily call it <i>pleasant</i>, but it's better.<p>An as for the language itself, Java8's lambdas + streams provide significant improvements.<p>Compare this (Java 7):<p><pre><code>  public static List<Integer> sortDescending(List<Integer> ints) {

      ints.sort(new Comparator<Integer>() {
          @Override
          public int compare(Integer o1, Integer o2) {
              return o1.equals(o2) ? 0 : o1 < o2 ? 1 : -1;
          }
      });

      return ints;
  }
</code></pre>
to this (Java 8):<p><pre><code>  public static List<Integer> sortDescending2(List<Integer> ints) {

      ints.sort((o1, o2) ->  o1.equals(o2) ? 0 : o1 < o2 ? 1 : -1);

      return ints;
  }
</code></pre>
(Example is contrived, since you could use the built in Collections.reverse() to achieve the same result. My main point is that we have eliminated ~4 lines (counting braces) of ceremony.)<p>All that said, I'd rather be using Clojure.