in java/src/main/scala/com/spotify/featran/java/JavaOps.scala [36:56]
def requiredFn[I, O](f: SerializableFunction[I, O]): I => O =
(input: I) => f(input)
def optionalFn[I, O](f: SerializableFunction[I, Optional[O]]): I => Option[O] =
(input: I) => f(input).toScala
def crossFn(f: BiFunction[JDouble, JDouble, JDouble]): (Double, Double) => Double =
(a, b) => f(a, b)
implicit val jListCollectionType: CollectionType[JList] = new CollectionType[JList] {
override def map[A, B: ClassTag](ma: JList[A])(f: A => B): JList[B] =
ma.asScala.map(f).asJava
override def reduce[A](ma: JList[A])(f: (A, A) => A): JList[A] =
Collections.singletonList(ma.asScala.reduce(f))
override def cross[A, B: ClassTag](ma: JList[A])(mb: JList[B]): JList[(A, B)] =
ma.asScala.map((_, mb.get(0))).asJava
override def pure[A, B: ClassTag](ma: JList[A])(b: B): JList[B] = Collections.singletonList(b)
}