当前位置: 首页 > 知识库问答 >
问题:

从批处理方法调用中收集结果 [重复]

翟奕
2023-03-14

我有以下问题:

我有一个如下的方法,一次只能收集500个名字:

public Optional<ResultDTO> executeRequest(final int time, List<Name> names)

我有一个1000个名字的列表,因此我想使用番石榴将这个列表划分为最大大小为500的子列表

List<List<Name>> nameBatches = Lists.partition(namesList, 500);

并将其传递给请求以获取结果DTO列表。如何在 Java8 中执行此操作?

共有2个答案

郤浩慨
2023-03-14

我不确定java 8中是否提供了类似的功能。当然,你可以在匿名函数中使用foreach,但是它比在java 8中使用List.subList()更难读。

Java 7中的解决方案:

        final Integer sizeOfChunk = 3;
        List<Integer> inputList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);

        //Guava
        List<List<Integer>> firstListOfLists = Lists.partition(inputList, sizeOfChunk);

        //Java 7
        List<List<Integer>> secondListOfLists = new ArrayList<List<Integer>>();
        for (int i=0; i<inputList.size()-sizeOfChunk; i+=sizeOfChunk) {
            secondListOfLists.add(inputList.subList(i, i+sizeOfChunk));
        }
        if (inputList.size() % sizeOfChunk != 0) {
            secondListOfLists.add(inputList.subList(secondListOfLists.size()*sizeOfChunk, inputList.size()));
        }

        System.out.println("Guava: " +  firstListOfLists);
        System.out.println("Java 7: " +  secondListOfLists);

编辑

在您发表评论后,它将是:

List<Optional<ResultDTO>> results = nameBatches .stream().map(l -> executeRequest(something, l)).collect(Collectors.toList()); 
谷梁波
2023-03-14

您必须创建一个< code>IntStream来遍历列表中的块,并在单独的映射步骤中创建子列表。

int chunkSize = 500;
int size = namesList.size();
// calc the number of chunks
int chunks = (size - 1) / chunkSize;

List<List<Name>> res = IntStream
    // range over all chunks
    .range(0, chunks + 1)
    // create sub-lists for each chunk
    .mapToObj(
        n -> namesList.subList(n * chunkSize, Math.min(size, (n + 1) * chunkSize)))
    // collect from Stream<List<String>> to List<List<String>>
    .collect(Collectors.toList());

编辑:根据你的评论

我的主要问题是如何为每个名称批次调用执行请求方法并存储结果。

只需添加一个. map(l-

 类似资料:
  • 假设我有一个类ClassA,这个类有一个toString方法。如果我有一个ClassA列表,我如何使用一个流创建一个新的字符串列表,在这个流中我遍历ClassA列表中的每个对象,并在一行中调用toString呢?大概是这样的:

  • 我必须运行多个外部调用操作,然后以列表的形式获得结果。我决定使用api,而我准备的代码相当恶心: 示例: 我有以下几个问题: > 我可以避免在流中重复块吗?在流中我将CompletableFuture映射到User? 此代码是否可以不那么连续(如何避免等待所有的未来完成?) 这样做可以吗(所有的未来都将在流中解决吗?):

  • QueryList返回的集合数据均为Collection集合对象而非普通数组,目的就是为了方便处理采集结果数据。 QueryList引入了Laravel中Collection集合对象,它提供了一个更具可读性的、更便于处理数组数据的封装。下面通过几个例子来说明它的用法,更多用法可以去查看Laravel文档。 Collection文档:https://d.laravel-china.org/docs/

  • 问题内容: 最初,我有一个类来存储一些处理后的值,并将其与其他方法重用。 问题是,当我尝试将类方法划分为多个进程以加快速度时,python生成了进程,但它似乎不起作用(正如我在“任务管理器”中看到的那样,只有1个进程在运行)并且结果从未交付。 我进行了几次搜索,发现pathos.multiprocessing可以代替它,但是我想知道标准库是否可以解决这个问题? 问题答案: 您的代码失败了,因为它无

  • 但是当我连接DB2数据库批处理时,它给我的错误如下。 添加属性(Spring.batch.schema=classpath:/org/springframework/batch/core/schema-db2.sql)后,由frenzykryger提及,得到以下异常。 添加属性(Spring.Batch.Initializer.Enabled=False)后,获得以下异常。

  • execute方法不仅可以执行单条查询语句,而且还可以执行多条查询语句,不同查询语句之间用分号(;)隔开。在给出例子之前,先使用如下SQL建立一个图书销售表t_booksale,并向其中插入三条记录。 建立t_booksale表 DROP TABLE IF EXISTS mydb.t_booksale; CREATE TABLE mydb.t_booksale ( id int(10)