Functional Programming in Java
JavaFunctional ProgrammingJava Problem Overview
Is there a good library for functional programming in Java?
I'm looking for stuff like Predicate and List.Find() (as a static method). Not complicated to implement, but it would be nice to find a reusable library here.
Java Solutions
Solution 1 - Java
FunctionalJava is the best known library; it makes use of Java closures (BGGA) for examples:
final Array<Integer> a = array(1, 2, 3);
final Array<Integer> b = a.map({int i => i + 42});
arrayShow(intShow).println(b); // {43,44,45}
EDIT
Check also lambdaj.
Further EDIT
BGGA is entirely optional. It just makes for nicer syntax.
Solution 2 - Java
Scala is a functional programming language that is fully compatible with Java (runs through the JVM). It offers a beautiful mix of object-oriented and functional techniques along with many improvements over Java in generics and concurrency. Some even say it could replace Java.
Solution 3 - Java
Java Libraries
There are libraries that can help you do this, by already doing the legwork for you and hiding the arcane things:
Mature / Established Libraries
More Obscure / Experimental Libraries
These will allow you to write Java code with a more functional approach and possibly more familiar syntax and semantic, as you'd expect from an FP-competent language. Within reason, that is.
JVM Languages
And obviously, you can implement a functional language on top of Java. So that you can then use that one as your FP language. Which is a bit of a higher-level of abstraction than what you asked for, but relatively within context (though I'm cheating a bit here, granted).
For instance, check out:
Quite Mature Languages
Less Mature or More Obscure Languages
Further Reading
You may also want to read or watch these articles or videos:
- Functional Progamming in the Java Language, IBM DeveloperWorks (2004)
- Functional Programming Java, Lambda the Ultimate (2004)
- Functional Programming: a Pragmatic Introduction, InfoQ/CodePalousa (2011)
Taken from my P.SE answer to "Is Functional Programming Possible in Java?"
Solution 4 - Java
Google collections has a decent selection of functional-programming style utility methods. Some classes of interest are Iterables, Iterators, Function, Functions, etc
It also has a bunch of collection classes as well!
Solution 5 - Java
Functional Java is one that's worth taking a look at and FunctionalJ is another.
Solution 6 - Java
If you want a pure Java solution check out lambdaj
http://code.google.com/p/lambdaj/
Besides the possibility to define and use closure in a DSL-style, it also allows to manipulate collections in a functional way, without explicitly write closures or loops
Solution 7 - Java
Jambda is another FP-library. From the documentation:
> Jambda is an attempt to provide the > Java(TM) world with tools and concepts > from functional programming (FP). > > The goals are several: >
- To provide Java programmers with expressive FP constructs
- To provide a bridge for Java programmers into the FP-world
- To see how far Java and generics can be stretched
> This > document is an attempt to introduce > Java programmers into the FP world, > and at the same time explain some (or > most) of the features in Jambda.
Solution 8 - Java
Apache Commons has some functional-ish code in it. See for example, the Predicate interface.
Solution 9 - Java
Google Guava has functional:
- collection operations
- concurrency constructs (Futures)
Solution 10 - Java
Or download OpenJDK 8 to try out Lambda expressions the way they will become in Java 8. Among others, the collection APIs are adjusted to support a functional style. See http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html for examples of new collection APIs and comparisons with Guava, LambdaJ and FunctionalJava.
Solution 11 - Java
Scala was mentioned here, but there's a lot lighter and more Java compatible language: Xtend. It compiles to plain Java and uses the same type system. It has great Eclipse support. You can mix .java
and .xtend
files in a single project.
Sample code:
def static void main(String[] args) {
val s = #[1,2,3].map[it+43].join(", ")
println(s);
}
Solution 12 - Java
Although Functional Java is the most popular but i'll suggest you to try Google guava lib.