Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java8 method reference used as Function object to combine functions

Is there a way in Java8 to use a method reference as a Function object to use its methods, something like:

Stream.of("ciao", "hola", "hello")     .map(String::length.andThen(n -> n * 2)) 

This question is not related to the Stream, it is used just as example, I would like to have answer about the method reference

like image 511
rascio Avatar asked Aug 25 '15 13:08

rascio


2 Answers

You can write a static method to do this:

import java.util.function.*;  class Test {     public static void main(String[] args) {         Function<String, Integer> function = combine(String::length, n -> n * 2);         System.out.println(function.apply("foo"));     }      public static <T1, T2, T3> Function<T1, T3> combine(         Function<T1, T2> first,         Function<T2, T3> second) {         return first.andThen(second);     } } 

You could then put it in a utility class and import it statically.

Alternatively, create a simpler static method which just returns the function it's given, for the sake of the compiler knowing what you're doing:

import java.util.function.*;  class Test {     public static void main(String[] args) {         Function<String, Integer> function = asFunction(String::length).andThen(n -> n * 2);         System.out.println(function.apply("foo"));     }      public static <T1, T2> Function<T1, T2> asFunction(Function<T1, T2> function) {         return function;          } } 
like image 164
Jon Skeet Avatar answered Oct 04 '22 18:10

Jon Skeet


You can just save it into a variable:

Function<String, Integer> toLength = String::length; Stream.of("ciao", "hola", "hello")       .map(toLength.andThen(n -> n * 2)); 

Or you can use a cast, but it's less readable, IMO:

Stream.of("ciao", "hola", "hello")       .map(((Function<String, Integer>) String::length).andThen(n -> n * 2)); 
like image 25
JB Nizet Avatar answered Oct 04 '22 20:10

JB Nizet