流式迭代器的最简单方法

时间:2015-08-31 18:31:56

标签: java iterator java-8 java-stream iterable

假设您要流式传递迭代器的元素;让我们使用Scanner的具体示例,它实现Iterator<String>

给定Iterator,说:

// Scanner implements Iterator<String>
Iterator<String> scanner = new Scanner(System.in);

从中创建Stream<String>的选项是笨重的:

StreamSupport.stream(
  Spliterators.spliteratorUnknownSize(scanner, Spliterator.ORDERED), false);

或稍微简洁,但是迟钝:

 StreamSupport.stream(
  ((Iterable<String>) () -> new Scanner(System.in)).spliterator(), false);

在JDK的某个地方是否有一个返回Stream<T>给定Iterator<T>的工厂方法?

1 个答案:

答案 0 :(得分:8)

我只想使用Image: ic_stage_2.png Format: PNG (Portable Network Graphics) Mime type: image/png Class: DirectClass Geometry: 176x176+0+0 Units: Undefined Type: PaletteAlpha Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: red: 4-bit green: 8-bit blue: 1-bit alpha: 1-bit Channel statistics: Pixels: 30976 Red: min: 102 (0.4) max: 255 (1) mean: 164.981 (0.646985) standard deviation: 75.296 (0.295278) kurtosis: -1.87106 skewness: 0.359086 entropy: 0.977354 Green: min: 150 (0.588235) max: 255 (1) mean: 193.222 (0.757735) standard deviation: 51.6737 (0.202642) kurtosis: -1.87106 skewness: 0.359086 entropy: 0.977354 Blue: min: 255 (1) max: 255 (1) mean: 255 (1) standard deviation: 0 (0) kurtosis: 0 skewness: 0 entropy: -nan Alpha: min: 0 (0) max: 255 (1) mean: 150.031 (0.588359) standard deviation: 125.493 (0.492131) kurtosis: -1.87106 skewness: 0.359086 entropy: 0.977354 Image statistics: Overall: min: 0 (0) max: 255 (1) mean: 179.543 (0.70409) standard deviation: 77.6019 (0.304321) kurtosis: 1.86389 skewness: -1.46287 entropy: -nan Alpha: srgba(255,255,255,0) #FFFFFF00 Colors: 2 Histogram: 18225: (102,150,255,255) #6696FFFF srgba(102,150,255,1) 12751: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) Rendering intent: Perceptual Gamma: 0.454545 Chromaticity: red primary: (0.64,0.33) green primary: (0.3,0.6) blue primary: (0.15,0.06) white point: (0.3127,0.329) Background color: white Border color: srgba(223,223,223,1) Matte color: grey74 Transparent color: none Interlace: None Intensity: Undefined Compose: Over Page geometry: 176x176+0+0 Dispose: Undefined Iterations: 0 Compression: Zip Orientation: Undefined Properties: date:create: 2015-10-26T11:27:52+02:00 date:modify: 2015-10-26T11:27:52+02:00 png:IHDR.bit-depth-orig: 1 png:IHDR.bit_depth: 1 png:IHDR.color-type-orig: 3 png:IHDR.color_type: 3 (Indexed) png:IHDR.interlace_method: 0 (Not interlaced) png:IHDR.width,height: 176, 176 png:PLTE.number_colors: 2 png:sRGB: intent=0 (Perceptual Intent) png:tRNS: chunk was found signature: a22844c38c7ef3a612d94c2d3b9d1be29bb9d5e2f897f87c92947946fe6bc868 Artifacts: filename: ic_stage_2.png verbose: true Tainted: False Filesize: 138B Number pixels: 31K Pixels per second: 30.976GB User time: 0.000u Elapsed time: 0:01.000 Version: ImageMagick 6.9.2-0 Q16 x86_64 2015-08-18 http://www.imagemagick.org 。是的,这是一个无限的流,但是来自Stream.generate(iterator::next)的扫描仪也是如此,除非你知道你要求多少行,在这种情况下它很容易使用

System.in

这可以防止迭代器必须迭代两次(一次作为迭代器,一次作为流)。

如果你需要一个大小的流而不知道它有多大,但是不想让你的代码混乱,只需创建一个明确采用Stream.generate(iterator::next).limit(numLines); 的实用工具方法:

Iterable<T>

最终比在一条线上把它全部塞进来更容易辨认,并且 然后,您只需拨打public static <T> Stream<T> stream(Iterable<T> it){ return StreamSupport.stream(it.spliterator(), false); } stream(()->iterator);

即可

您也可以轻松添加第二种便捷方法:

stream(()->new Scanner(System.in));

让您拨打public static <T> Stream<T> stream(Iterator<T> it){ return stream(()->it); } stream(iterator);

虽然,如果我要将stream(new Scanner(System.in));读入流中,我可能会使用Reader而不是扫描仪:

System.in