我正在开发一个解决方案,我需要填充DataObject中的某些字段,虽然字段是预定义的,但我需要填充此数据的源不在我的控制范围内,我无法进行任何修改或更改。< / p>
这是我的源对象的结构
SourceObject
-Collection<Features>
-Collection<FeatureData>
属性名称在SourceObject
中定义,这将帮助我决定是否需要该属性值(有许多属性(Framework Provided + Custom one
))并且正在从{{1}提供值}
Collection<FeatureData>
但这意味着我必须为所有自定义属性执行此操作(检查并填写)。有没有办法可以很好地处理它? 请不要过多关注语法或任何潜在的NPE等,因为我将处理这些问题
答案 0 :(得分:0)
从我的代码中我可以理解的是,您正在尝试查找sourceData
与code
值匹配的第一个"classification"
以及其features
集合所在的sourceData
#39; t空。
然后,一旦找到此feature
,您就会尝试找到sourceData
features
个code
集合中的第一个"customValue1"
featureValueData
其中包含feature
且其productData
集合不为空。
找到此类power
后,您实际上是将featureValueData
&#39; s featureValueData
设置为第一个feature
所持有的值// Start
SourceData sourceData = findFirstValidSource(productData.getSourceData());
if (sourceData == null) // Can remove this check if sure that at least one valid source data will always exist.
{
return;
}
FeatureData feature = findFirstValidFeature(sourceData.getFeatures());
if (feature == null) // Can also remove this check if sure that at least one valid feature data will always exist.
{
return;
}
FeatureValueData featureValueData = feature.getFeatureValues().iterator().next();
productData.setPower(featureValueData.getValue());
// End
的{{1}}集合。
此类代码可以按如下方式重写:
findFirstValidSource()
private SourceData findFirstValidSource(Collection<SourceData> sources)
{
for (SourceData source : sources)
{
if (source.getCode().equalsIgnoreCase("classification") && CollectionUtils.isNotEmpty(source.getFeatures()))
{
return source;
}
}
return null;
}
方法实现如下:
findFirstValidFeature()
private FeatureData findFirstValidFeature(Collection<FeatureData> features)
{
for (FeatureData feature : features)
{
if (feature.getCode().contains("customValue1") && CollectionUtils.isNotEmpty(feature.getFeatureValues()))
{
return feature;
}
}
return null;
}
方法实现如下:
getFeatureValues()
上面的代码也将完成您的代码所做的完全相同的事情,除了它现在更易读和易懂。如果您使List
方法返回Collection
而不是ArrayList
,代码可以节省更多处理,因为它可以通过索引获取第一个元素(如果实现为{{ 1}}基于)或通过获取第一个元素(如果实现基于LinkedList
),这将花费不变的时间。
并不是iterator().next()
需要花费更多时间,在这种情况下创建迭代器是没有用的,因为我没有像在线中那样要求它:
FeatureValueData featureValueData = feature.getFeatureValues().iterator().next();
如果getFeatureValues()
返回List
,我们可以写一下:
FeatureValueData featureValueData = feature.getFeatureValues().get(0);
代替。
此外,通过使用JDK 8中引入的Lambda Expressions和Streams,可以使代码更紧凑。如果使用Java 8的新功能没有问题,我可以更新我的答案,将terser解决方案合并为好。
如果我的答案有所帮助,或者您的期望仍未达到,请告诉我。