优化的方法来填充对象中的数据

时间:2014-03-22 17:53:25

标签: java

我正在开发一个解决方案,我需要填充DataObject中的某些字段,虽然字段是预定义的,但我需要填充此数据的源不在我的控制范围内,我无法进行任何修改或更改。< / p>

这是我的源对象的结构

SourceObject
   -Collection<Features>
           -Collection<FeatureData>

属性名称在SourceObject中定义,这将帮助我决定是否需要该属性值(有许多属性(Framework Provided + Custom one))并且正在从{{1}提供值}

Collection<FeatureData>

但这意味着我必须为所有自定义属性执行此操作(检查并填写)。有没有办法可以很好地处理它? 请不要过多关注语法或任何潜在的NPE等,因为我将处理这些问题

1 个答案:

答案 0 :(得分:0)

从我的代码中我可以理解的是,您正在尝试查找sourceDatacode值匹配的第一个"classification"以及其features集合所在的sourceData #39; t空。

然后,一旦找到此feature,您就会尝试找到sourceData featurescode集合中的第一个"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解决方案合并为好。

如果我的答案有所帮助,或者您的期望仍未达到,请告诉我。