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)
这是可行的,但我有两个问题:
您可以像这样使用流来获取输入并在处理之前过滤掉它们
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())代码>