Java8:映射Lambda表达式

Java8:映射Lambda表达式,java,collections,lambda,java-8,Java,Collections,Lambda,Java 8,我有一个Map multiFieldMap,我需要在其值集上创建它,并将值添加到multifieldlist,如下所示 public List<Object> fetchMultiFieldsList() { List<Object> multiFieldsList = new ArrayList<Object>(); for (Entry<String, List<Object>> entry : multiField

我有一个
Map multiFieldMap
,我需要在其值集上创建它,并将值添加到
multifieldlist
,如下所示

public List<Object> fetchMultiFieldsList() {
    List<Object> multiFieldsList = new ArrayList<Object>();
    for (Entry<String, List<Object>> entry : multiFieldMap.entrySet()) {
        String entityName = entry.getKey();
        List<Object> ids = entry.getValue();
        for (Object id : ids) {
            Object entity = queryService.query(entityName, queryService.property("id").eq(id));
            multiFieldsList.add(entity);
        }
    }
    return multiFieldsList;
}
公共列表获取多字段列表(){
List multifieldlist=new ArrayList();
for(条目:multiFieldMap.entrySet()){
字符串entityName=entry.getKey();
List id=entry.getValue();
用于(对象id:ids){
Object entity=queryService.query(entityName,queryService.property(“id”).eq(id));
多字段列表。添加(实体);
}
}
返回多字段列表;
}

我想知道这个方法是否可以进一步简化?

您确实可以使用流来简化内部循环

您可以替换:

List<Object> ids = entry.getValue();
for (Object id : ids) {
    Object entity = queryService.query(entityName, queryService.property("id").eq(id));
    multiFieldsList.add(entity);
}
但你并没有从中获得太多。你的选择


有关“全流”解决方案,请参见@Eran的答案。

您可以使用流API:

List<Object> multiFieldsList = 
    multiFieldMap.entrySet()
                 .stream()
                 .flatMap(e -> e.getValue()
                                .stream()
                                .map(o -> queryService.query(e.getKey(), queryService.property("id").eq(o))))
                 .collect(Collectors.toList());
列表多字段列表=
multifiedMap.entrySet()
.stream()
.flatMap(e->e.getValue()
.stream()
.map(o->queryService.query(e.getKey(),queryService.property(“id”).eq(o)))
.collect(Collectors.toList());

您可以这样简化它:

public List<Object> fetchMultiFieldsList() {
    List<Object> multiFieldsList = new ArrayList<>();
    multiFieldMap.forEach( (entityName, ids ) ->
        ids.forEach( id -> multiFieldsList.add(
            queryService.query(entityName, queryService.property("id").eq(id)))
        )
    );
    return multiFieldsList;
}
公共列表获取多字段列表(){
List multifieldlist=new ArrayList();
多字段映射forEach((entityName,ID)->
id.forEach(id->multifieldlist.add(
queryService.query(entityName,queryService.property(“id”).eq(id)))
)
);
返回多字段列表;
}

除非您想使用
API,否则该方法可能是代码简化方面的最大胜利,因为您不再需要处理
Map.Entry
及其通用签名…

这是一种典型的情况,我个人认为完整流解决方案的可读性实际上不如“好的旧解决方案”foreach循环:pCode简化并不总是需要
Stream
API使用…
public List<Object> fetchMultiFieldsList() {
    List<Object> multiFieldsList = new ArrayList<>();
    multiFieldMap.forEach( (entityName, ids ) ->
        ids.forEach( id -> multiFieldsList.add(
            queryService.query(entityName, queryService.property("id").eq(id)))
        )
    );
    return multiFieldsList;
}