在传输另一个列表时将数据添加到列表中

时间:2017-09-29 12:53:18

标签: java java-8 java-stream collectors

假设我们有一些实体,每个实体都有一个可搜索字段列表和一个类型。是否有更好的(阅读更有效的方法)在列表中为每个不同类型的实体映射这些字段。

目前我正在做的是:

final Collection<IndexedField> indexedFields = new ArrayList<>();
for (String type : types) {
    final Class<? extends IndexedEntity> targetClass = indexedEntities.getClassByType(type);
    indexedFields.addAll(indexedEntities.getSearchFieldsFor(targetClass));
}

这有效,但有没有更好的方法来实现这一目标?也许是流api的东西。

3 个答案:

答案 0 :(得分:4)

如果我理解正确:

 types.stream()
     .map(indexedEntities::getClassByType)
     .flatmap(x -> indexedEntities.getSearchFieldsFor(x).stream())
     .collect(Collectors.toList());

答案 1 :(得分:0)

您可以将其缩短为

types.stream().<Class<? extends IndexedEntity>>map(
            type -> indexedEntities.getClassByType(type)).<Collection<? extends IndexedField>>map(
            targetClass -> indexedEntities.getSearchFieldsFor(targetClass)).forEach(indexedFields::addAll);

答案 2 :(得分:0)

您也可以只使用方法参考编写:

final Collection<IndexedField> indexedFields = types.stream()
                                       .map(indexedEntities::getClassByType)
                                       .map(indexedEntities::getSearchFieldsFor)
                                       .flatMap(Collection::stream)
                                       .collect(Collectors.toList());