Java8方法参考用作组合功能的Function对象


问题内容

Java8中是否有一种方法可以将方法引用用作Function对象来使用其方法,例如:

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

这个问题与无关Stream,仅作为示例,我想对方法参考有答案


问题答案:

您可以编写一个静态方法来执行此操作:

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);
    }
}

然后,您可以将其放在实用程序类中并静态导入。

或者,创建一个更简单的静态方法,该方法 返回给定的函数,以使编译器知道您在做什么:

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;     
    }
}