创建函数流的更好方法是什么?

bur*_*ete 6 java java-8 java-stream functional-interface

我希望对我定义的函数列表进行惰性评估,如下所示;

Optional<Output> output = Stream.<Function<Input, Optional<Output>>> of(
                    classA::eval, classB::eval, classC::eval)
            .map(f -> f.apply(input))
            .filter(Optional::isPresent)
            .map(Optional::get)
            .findFirst();
Run Code Online (Sandbox Code Playgroud)

如您所见,每个类(a,b和c)都Optional<Output> eval(Input in)定义了一个方法.如果我尝试做

Stream.of(...)....
Run Code Online (Sandbox Code Playgroud)

它忽略了显式类型

T不是功能界面

编译错误.不接受T泛型类型的功能接口类型.of(T... values)


有没有更快捷的方法来创建这些功能的流?我讨厌明确定义of方法Function及其输入输出类型.它不会以更通用的方式工作吗?

这个问题源于以下问题的主题;
Lambda表达式和通用方法

Era*_*ran 5

你可以把它分成两行:

Stream<Function<Input, Optional<Output>>> stream = Stream
          .of(classA::eval, classB::eval, classC::eval);
Optional<Output> out = stream.map(f -> f.apply(input))
          .filter(Optional::isPresent)
          .map(Optional::get)
          .findFirst();
Run Code Online (Sandbox Code Playgroud)

或使用铸造:

Optional<Output> out = Stream.of(
                (<Function<Input, Optional<Output>>>)classA::eval, 
                classB::eval, 
                classC::eval)
        .map(f -> f.apply(input))
        .filter(Optional::isPresent)
        .map(Optional::get)
        .findFirst();
Run Code Online (Sandbox Code Playgroud)

但我认为您无法避免在某处指定Stream元素的类型Function<Input, Optional<Output>>,否则编译器无法从方法引用中推断出它。