This adaptor provides functions and macros to ease Clojure/RxJava interop. In particular, there are functions and macros for turning Clojure functions and code into RxJava Func* and Action* interfaces without the tedium of manually reifying the interfaces.
The first thing to do is to require the namespace:
(ns my.namespace
(:require [rx.lang.clojure.interop :as rx])
(:import [rx Observable]))or, at the REPL:
(require '[rx.lang.clojure.interop :as rx])Once the namespace is required, you can use the rx/fn macro anywhere RxJava wants a rx.util.functions.Func object. The syntax is exactly the same as clojure.core/fn:
(-> my-observable
(.map (rx/fn [v] (* 2 v))))If you already have a plain old Clojure function you'd like to use, you can pass it to the rx/fn* function to get a new object that implements rx.util.functions.Func:
(-> my-numbers
(.reduce (rx/fn* +)))The rx/action macro is identical to rx/fn except that the object returned implements rx.util.functions.Action interfaces. It's used in subscribe and other side-effect-y contexts:
(-> my-observable
(.map (rx/fn* transform-data))
(.finallyDo (rx/action [] (println "Finished transform")))
(.subscribe (rx/action [v] (println "Got value" v))
(rx/action [e] (println "Get error" e))
(rx/action [] (println "Sequence complete"))))Here are a few things to keep in mind when using this interop:
- Keep in mind the (mostly empty) distinction between
FuncandActionand which is used in which contexts - If there are multiple Java methods overloaded by
Funcarity, you'll need to use a type hint to let the compiler know which one to choose. - Methods that take a predicate (like filter) expect the predicate to return a boolean value. A function that returns a non-boolean value will result in a
ClassCastException.
Binaries and dependency information for Maven, Ivy, Gradle and others can be found at http://search.maven.org.
Example for Maven:
<dependency>
<groupId>com.netflix.rxjava</groupId>
<artifactId>rxjava-clojure</artifactId>
<version>x.y.z</version>
</dependency>and for Ivy:
<dependency org="com.netflix.rxjava" name="rxjava-clojure" rev="x.y.z" />and for Leiningen:
[com.netflix.rxjava/rxjava-clojure "x.y.z"]