Java 8:链消费者<Y>到函数<X,Y>

 mobiledu2502857983 发布于 2023-02-10 23:13

探索的Java 8的新功能,我迷迷糊糊的想创建一个Consumer通过一个链接ConsumerFunction.

这有意义吗?如果是这样,一个好的(通用)解决方案会是什么样子?


我尝试了什么(相当于一个例子的特例):

特定

@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 static  Function> 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));

但是,对显式通用规范的需求并不是最佳的.希望有更好的东西?

2 个回答
  • 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(...)
    }
    

    如果添加一个忽略空值作为输入的收集器,它会变得更好.

    编辑:我写了这个没有语法检查或编译,所以不完全确定默认的位置,以及编译器是否可以成功推断链式函数类型参数.

    2023-02-10 23:35 回答
  • 您可以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);
    

    2023-02-10 23:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有