But in Java (and most other languages) the programmer needs to think no only about those higher-level issues, but also about the lower-level structures and algorithms
I don't agree this is a good thing. For a higher level language (one that uses a VM anyway), this is a sign of the failings of that said language. As for thinking about lower-level structures and algorithms, if that is your glory, you will have much more fun in C.
IMHO, Java is halfway between a lower-level language (without the functionality) and a higher-level language (without the expressive constructs).
Apologies to Van Halen, but it's the "Worst of Both Worlds". A good language allows both (the "Best of Both Worlds"), in both the gory detail of low-level programming, and the expressiveness of things such as (cleanly implemented) lambda functions -- and the programmer would be able to switch between them at his/her chosing, not based on internal requirement or language deficiency.