Functional Programming for Java Developers: Tools for Better Concurrency, Abstraction, and Agility