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
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; } }
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With