https://github.com/ike-tools/ike.cljj.git
git clone 'https://github.com/ike-tools/ike.cljj.git'
(ql:quickload :ike-tools.ike.cljj)
Clojure provides some nice Java interop features, but they are missing clean support for newer APIs added to Java 7 and 8.
ike.cljj is a Clojure library of wrappers around Java APIs.
ike.cljj.function → java.util.function and others)ike.cljj.stream → java.util.stream)ike.cljj.file → java.nio.file)NOTE: ike.cljj depends on APIs added in Java 7 and/or 8.
Requiring the ike.cljj.stream namespace will add support for two main things:
stream-seq.CollReduce impl)(let [stream (IntStream/range 0 10)]
(= 25 (transduce (filter odd?) + stream))))
As of Java 8, there is powerful support in the Java language for lambdas and method references. One of these features is that methods that accept an argument which is a Single Abstract Method (SAM) interface can also accept any method reference or lambda of the same shape/type.
This unforunately does not translate to Clojure users.
The ike.cljj.function namespace includes three main helpers for this:
sam* - function converting a Clojure function to an arbitrary SAM interfacesam - creating an anonymous SAM impl, as it were a Clojure functiondefsam - defining a named SAM impl, as if it were a Clojure functionWARNING: You may need type hints to avoid IllegalAccessError in Java 9+.
(defsam my-sam
java.util.function.Predicate
[x]
(= x "it matched"))
;; ignore that I'm not using ike.cljj.stream here
(-> (Stream/of "not a match" "it matched")
(.filter my-sam)
(.collect Collectors/toList)
Note that primitive streams require different SAM types.
;; ignore that I'm not using ike.cljj.stream here
(-> (IntStream/range 0 10)
(.filter (sam* java.util.function.IntPredicate odd?))
(.collect Collectors/toList)
The NIO2 API for files is much improved over java.io.File, but has some headaches from
Clojure, namely the extensive use of varargs. The ike.cljj.file namespace provides wrappers
over these functions for two benefits:
into-array calls)Pathish protocol that already converts many common types
to Path (e.g. String, File, URI).Please use the repo's issues for all questions, bug reports, and feature requests.
Contributions are very welcome and are accepted through pull requests.
Smaller changes can come directly as a PR, but larger or more complex ones should be discussed in an issue first to flesh out the approach.
If you're interested in implementing a feature on the issues backlog, add a comment to make sure it's not already in progress and for any needed discussion.
Copyright © 2015-2016 Andrew Oberstar
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.