探索的Java 8的新功能,我迷迷糊糊的想创建一个Consumer
通过一个链接Consumer
来Function
.
这有意义吗?如果是这样,一个好的(通用)解决方案会是什么样子?
我尝试了什么(相当于一个例子的特例):
特定
@FunctionalInterface public interface PartialFunction{ Y apply(X x) throws Exception; }
和
import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; public class PartialFunctions { public staticFunction > withOptionalResults(final PartialFunction funcThatThrows) { return z -> { try { return Optional.of(funcThatThrows.apply(z)); } catch (final Exception e) { return Optional.empty(); } }; } public static Consumer acceptOnSuccess(final PartialFunction g, final Consumer c) { return x -> withOptionalResults(x).apply(t).ifPresent(c); } }
我最终得到了一个可能的用法:
files.forEach(PartialFunctions.acceptOnSuccess( ImageIO::read, images::add));
但是,对显式通用规范的需求并不是最佳的.希望有更好的东西?
interface IgnoreThrowing<F,V> extends Function<F,V> { public default V apply(F from) { try { return ignore(from); } catch(Exception e) { return null; } } public V ignore(F from) throws Exception; } class Throwables { public static <F,V> Function<F,V> ignore(IgnoreThrowing<F,V> f) { return f; } } static { files.map(Throwables.ignore(ImageIO::read)).collect(...) }
如果添加一个忽略空值作为输入的收集器,它会变得更好.
编辑:我写了这个没有语法检查或编译,所以不完全确定默认的位置,以及编译器是否可以成功推断链式函数类型参数.
您可以Function
像这样扩展接口:
public interface ComposableFunction<T, R> extends Function<T, R> { default Consumer<T> andThen(Consumer<R> after) { Objects.requireNonNull(after); return (T t) -> {after.accept(apply(t));}; } }
然后像这样定期使用它:
ComposableFunction<Throwable, String> getMessage = Throwable::getMessage; Consumer<String> log = System.out::println; Consumer<Throwable> logMessage = getMessage.andThen(log);