- Supporting higher order functions in programming languages. Check.
- Usual operations on higher-order functions like currying? Check.
- Functional reactive programming. Check. Rx was a big thing a few years ago.
- Purely functional data structures. Check. Even Java has a few reasonably popular libraries that support such data structures.
- Using referential transparency whenever we can. Check.
- Using CPS (continuation-passing style) in daily programming. Check.
- Using recursion in production. This is not functional programming per se, but given that so many people mention recursion whenever they mention functional programming, it's worth listing recursion here. And mutual recursion and tail recursion, two of the hallmarks of entry-level functional programming techniques? Check and check. For instance, RxJava implements trampoline just to support tail-recursion, as it is necessary to implement cleanly some of RxJava's operators.
- Common techniques seen in functional programming, particularly the ones that involve map, reduce, scan, left-fold and right-fold. Check.
This is just the items that are on top of my mind. I'm sure I missed plenty. The gist is that people have been adopting functional programming. They just don't necessarily move to a purely functional programming language for practical reasons: platform, support, community, ecosystems, or even marketing. Programming paradigm is just one factor among many when people choose their programming languages.