创建函数流的更好方法?
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));
我希望对定义如下的函数列表进行惰性求值;
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));