探索Java 8的新功能,我想通过将Consumer<Y>
链接到Function<X,Y>
来创建一个Consumer<X>
。
这有意义吗?如果有的话,一个好的(通用)解决方案应该是什么样子的?
我尝试过的方法(举个特殊例子):
假设
@FunctionalInterface
public interface PartialFunction<X, Y> {
Y apply(X x) throws Exception;
}
并且
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
public class PartialFunctions {
public static <X, Y> Function<X, Optional<Y>> withOptionalResults(final PartialFunction<X, Y> funcThatThrows) {
return z -> {
try {
return Optional.of(funcThatThrows.apply(z));
} catch (final Exception e) {
return Optional.empty();
}
};
}
public static <X, Y> Consumer<X> acceptOnSuccess(final PartialFunction<X, Y> g, final Consumer<Y> c) {
return x -> withOptionalResults(x).apply(t).ifPresent(c);
}
}
我最终可能使用的方式是:
files.forEach(PartialFunctions.<File, BufferedImage>acceptOnSuccess(
ImageIO::read, images::add));
然而,需要明确的通用规范并不是最佳选择。希望有更好的解决方案?
acceptOnSuccess
的调用。我更喜欢使用Optional
作为这里的选择,而不是使用null
。 - Maurice Naftalin