创建函数流的更好方法?

Better way to create a stream of functions?

我希望对定义如下的函数列表进行惰性求值;

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

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

Stream.of(...)....

忽略显式类型,它给出

T is not a functional interface

编译错误。不接受 .of(T... values)

T 通用类型的功能接口类型

是否有更快速的方法来创建这些函数的流?我讨厌用 Function 及其输入输出类型显式定义 of 方法。它不会以更通用的方式工作吗?

本期源于以下问题的主题;
Lambda Expression and generic method

你可以把它分成两行:

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

或使用转换:

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

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

有一种方法可以省略Function<Input, Optional<Output>>类型,但这不一定是一种改进

Optional<Output> o =
        Stream.concat(Stream.of(input).map(classA::eval),
                Stream.concat(Stream.of(input).map(classB::eval),
                              Stream.of(input).map(classC::eval)))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .findFirst();

而且它不缩放。

看来,最好的选择是等待Java-9,在那里你可以使用

Optional<Output> o = classA.eval(input)
           .or(() -> classB.eval(input))
           .or(() -> classC.eval(input));