java8聚合对象转换器

java8聚合对象转换器,java,lambda,java-8,Java,Lambda,Java 8,我有一个聚合转换器: public O convert() { output = getOutput(); final List<GenericConverterBase> converters = getConverters(); for (GenericConverterBase converterBase : converters) { output = (O) Optional.ofNullable(converterBase.ge

我有一个聚合转换器:

public O convert() {
    output = getOutput();

    final List<GenericConverterBase> converters = getConverters();

    for (GenericConverterBase converterBase : converters) {
        output = (O) Optional.ofNullable(converterBase.getInput()).map(converterBase::apply).orElse(output);
    }

    return output;
}
public O convert(){
output=getOutput();
最终列表转换器=getConverters();
用于(通用转换器基础转换器基础:转换器){
输出=(O)可选的.ofNullable(converterBase.getInput()).map(converterBase::apply).orElse(输出);
}
返回输出;
}
基本上,getConverters()返回一个转换器列表,这些转换器具有apply-in的具体实现,并填充一种常见的对象(比如OutputDTO)

这是可行的,但我有两个问题:

  • 是否可以使用Java8函数方法对每个循环进行转换
  • 前提:实际上,输出填充了新属性并保留了旧属性,即循环第二次调用converter.apply()时,输出将是第二次和前一次的结果

  • 我需要在循环中强制转换到(O),否则java不会编译,因为它说“required O,found Object”。通过应用强制转换(O),我解决了这个问题,顺便说一句,编译器警告我“未检查强制转换”。有没有其他解决办法

  • 您可以像这样使用流来获取输入并在处理之前过滤掉它们

    output = getOutput();
    emptyIfNull(getConverters())
        .stream()
        .map(GenericConverterBase::getInput)
        .filter(Objects::nonNull)
        .forEach(input -> output = input.apply(output)); // here I suppose you will need to provide casting to O
    return output;
    

    关于施法-问题是你的
    apply
    方法返回了什么-如果
    Object
    你必须施法,如果不能,你可以使转换器通用,在同一类型的O超类/接口上操作,并将此类型推断为
    convert
    方法

    问题:为什么不从
    converters
    中选择最后一个元素(映射后)将其分配给
    输出
    变量?迭代的目的是什么?对于类
    GenericConverterBase
    O
    (这里不假设它是泛型的)来说,分享与问题相关的实现是值得的。这可能是因为如果
    输入是null@m.antkowicz这不能解释任何事情。搜索最后一次出现的非
    null
    输入具有相同的效果,但工作量要小得多。无需插入原始代码中不存在的可疑
    emptyIfNull(…)
    。此外,此代码仅在
    输出
    为字段(即非局部变量)时有效。由于这会重复覆盖
    输出
    ,这归结为使用最后一次出现,因此一个干净的解决方案是
    output=getConverters().stream().map(GenericConverterBase::getInput).filter(Objects::nonNull).map(converterBase::apply).reduce((a,b)->b.orElse(getOutput())