java - 将 LongStream 分成最大长度的子流

标签 java java-stream

我的程序中有一些 SQL 语句包含具有给定 ID 的 IN 子句。问题是在某些情况下可能有超过 1000 个 ID,这会导致 Oracle 崩溃并出现 ORA-01795。项目太多。

所以我想把这个列表分成多个子列表。

例子:我有 2403 个 ID

结果将是三个列表:

  1. 0 - 999
  2. 1000 - 1999
  3. 2000 - 2402

我写了一段有效的代码,但看起来很糟糕。这个问题有更好的解决方案吗?也许是 Collectors 和 groupingby 之类的东西?

我的代码:

    Map<Integer, List<Long>> result = new HashMap<>();
    ArrayList<Long> asList = new ArrayList<Long>(listOfIds);
    IntStream.range(0, (listOfIds.size() / 1000) + 1)
             .forEach(partGroup -> result.put(partGroup, asList.subList(partGroup * 1000, (partGroup * 1000) + Math.min(1000, 
             asList.size() - partGroup * 1000))));

最佳答案

如果不使用第三方库,我不认为你能做得更好。我个人使用这个效用函数,它与你所做的很接近:

public static <T> Stream<List<T>> splitListStream(List<T> input, int batchSize) {
  if (batchSize <= 0)
    throw new IllegalArgumentException("batchSize must be positive (" + batchSize + ")");
  if (input.size() <= batchSize) return Stream.of(input);
  return IntStream.range(0, (input.size() + batchSize - 1) / batchSize)
          .mapToObj(i -> {
            int from = i * batchSize;
            int to = Math.min((i + 1) * batchSize, input.size());
            return input.subList(from, to);
          });
}

关于java - 将 LongStream 分成最大长度的子流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45078134/

相关文章:

java-8 - 将 list<Object> 转换为 java 8 流中的 <Id> 数组

java - 对整数列表上的多个属性进行排序

java - Android 中如何将数字转换为日期?

java - 使用 Apache Lucene 创建出现 vector

Java 8 : Map instead of simple loop

java - 使用流 API 将 List<T> 转换为 Map<T.Prop, List<T>>

java - 打印 ArrayList 的成员

java - 从进程中获取输出

java - 生成随机数,第一个为零

java - 按属性隔离列表