假设您要流式传递迭代器的元素;让我们使用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>
的工厂方法?
答案 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