java - Int 流和收集

标签 java java-8 java-stream

所以我很难理解 IntStream 中收集的这个供应商、累加器和组合器的原理。我找到了一个例子。

IntStream.range(6,11)
         .collect(StringBuilder::new, 
                  StringBuilder::appendCodePoint,
                  StringBuilder::append);

有人介意解释一下 StringBuilder::appendCodePoint 部分吗?

最佳答案

让我们包装这个流,从中生成 byte[],然后从结果数组中生成 String:

Arrays.toString(IntStream.range(6,11).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString().getBytes())

这会给我们:

[6, 7, 8, 9, 10]

收集是如何工作的?

它获取 6..10 的流并按以下顺序收集它:

  1. 它构建了一个新的 StringBuilder 实例
  2. 累加,即使用 StringBuilder::appendCodePoint 将 Unicode 代码点附加到累加器。 (相当于:(StringBuilder sb, int x) -> sb.appendCodePoint(x))
  3. 组合,即将 (2) 的结果添加到 (1) 中创建的 StringBuilder 实例中。 (相当于:(StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2))

此参数化 collect() 调用的类型签名如下所示:

collect(Supplier<StrinBuilder> supplier,
                  ObjIntConsumer<StrinBuilder> accumulator,
                  BiConsumer<StrinBuilder, StrinBuilder> combiner);

关于java - Int 流和收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44421779/

相关文章:

java - 避免在 servlet 中使用 html

java - 使用 mail-service.xml 文件从 jboss 发送电子邮件

java - 返新目的?

lambda - 将流与类和子类一起使用的最佳方法

java - 为什么不使用自定义比较器从TreeSet中删除,则会删除较大的项集?

带有两个列表的 Java 8 流

java - java-8中的Stream方法是如何实现的?

java - 我正在尝试在我的方法中使用小程序

java - 使用 recover() 时类型不匹配错误

java - 将 InputStream 转换为固定长度字符串的 Stream<String>