Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分割并合并源java流的多个映射_Java_Java Stream - Fatal编程技术网

分割并合并源java流的多个映射

分割并合并源java流的多个映射,java,java-stream,Java,Java Stream,我有一系列标识符。我想构建一个实体,通过标识符从存储库中获取哪些字段。它应该通过单独的方法完成,每个方法都需要标识符。似乎应该这样做: ,---.map(id -> repo.getField1ById(id))---\ <id1,id2,id3,...> -+---.map(id -> repo.getField2ById(id))---+- map((f1,f2) -> entity.builder().field1(f1)

我有一系列标识符。我想构建一个实体,通过标识符从存储库中获取哪些字段。它应该通过单独的方法完成,每个方法都需要标识符。似乎应该这样做:

                   ,---.map(id -> repo.getField1ById(id))---\
<id1,id2,id3,...> -+---.map(id -> repo.getField2ById(id))---+- map((f1,f2) -> entity.builder().field1(f1).field2(f2).build())
,--.map(id->repo.getField1ById(id))---\
-+---.map(id->repo.getField2ById(id))--+-map((f1,f2)->entity.builder().field1(f1).field2(f2.build())
那么,以任何简单的方式都有可能吗

UPD

更详细。 我需要建立实体列表。实体字段位于存储库中,可通过标识符访问。我有这些标识符的列表。因此,对于每个标识符,我需要调用存储库方法,并将这些结果放入要构建的实体中。我应该得到这些构建实体的流(或列表)。 我从

public List<Entity> method(List<String> identifiers) {
    return identifiers.parallelStream().map(i -> repo.getObjectPropsFirstPart(i)).
...
}
公共列表方法(列表标识符){
返回标识符.parallelStream().map(i->repo.getObjectPropsFirstPart(i))。
...
}
很明显,现在在地图链中,我失去了标识符流,无法返回到这个位置,所以我应该有类似流划分的东西。 嗯,我明白了,可以这样做:

public List<Entity> method(List<String> identifiers) {
    return identifiers.parallelStream().map(i -> 
        entity.builder().field1(repo.getObjectPropsFirstPart(i))
            .field2(repo.getObjectPropSecondPart(i)).build());
}
公共列表方法(列表标识符){
返回标识符.parallelStream().map(i->
entity.builder().field1(repo.getObjectPropsFirstPart(i))
.field2(repo.getObjectPropSecondPart(i)).build();
}

但是,是否有机会分割源流和每个对象合并?

您可以这样做

List<Person> people = List.of(1, 2, 3).parallelStream()
        .flatMap(id -> List.of(PersonProvider.of(id, Merging::ageProvider), PersonProvider.of(id, Merging::nameProvider)).parallelStream())
        .map(Supplier::get)
        .collect(Collectors.collectingAndThen(Collectors.groupingBy(Person::getId), Merging::mergePerson));
System.out.println("people = " + people);
最后,您需要一个合并所有函数的函数

private static List<Person> mergePerson(Map<Integer, List<Person>> map) {
    return map.values().stream()
            .map(Merging::mergePerson)
            .collect(Collectors.toList());
}

private static Person mergePerson(List<Person> list) {
    return list.stream()
            .reduce(new Person(), Person::merge);
}
private静态列表mergePerson(映射){
返回map.values().stream()
.map(合并::mergePerson)
.collect(Collectors.toList());
}
私人静态人员合并人员(列表){
return list.stream()
.reduce(new Person(),Person::merge);
}

我希望这能解决您的问题:)

对不起,无法确定您的要求。请用更多细节和示例输入数据重新表述您的问题。然后展示到目前为止您已经尝试过的内容。好的,我会尝试,谢谢。为什么不合并第二和第三阶段,这样您就有了
map(id->entity.builder().field1(repo.getField1ById(id)).field2(repo.getField2ById(id)).build()
或类似内容?@hacatu是的,谢谢,可以这样,我在上面的更新中写的。我只是想用parallelStream以一种更并行的方式来做。甚至那些对field1和field2的请求也需要并行完成。是吗?是的,但这取决于
repo
如何处理并行请求。如果您有一个基于promise/future的api,那么只需使用您传递的映射创建期货的函数,该函数包含您要从
repo
中提取的所有字段的值,然后等待两个期货都得到解决。然而,这样做可能不会有多大好处。parallelStream中的“并行”是指并行处理流中不同元素的能力,因此通常对单个元素进行并行处理不是一个好主意
private static List<Person> mergePerson(Map<Integer, List<Person>> map) {
    return map.values().stream()
            .map(Merging::mergePerson)
            .collect(Collectors.toList());
}

private static Person mergePerson(List<Person> list) {
    return list.stream()
            .reduce(new Person(), Person::merge);
}