2016-08-11 103 views
1

下面的代码使用lambda expression创建空的地图Stream,下一行用于输出流中的任何元素。但是在运行代码时它会给出无限的输出。我不知道为什么,因为地图是空的,它应该打印{}一次。有人可以解释发生了什么事吗?Java 8无限流输出

Stream<Map<String,String>> mapStream = Stream.generate(() -> { 
     return Collections.emptyMap(); 
    }); 
    mapStream.forEach(System.out::println); 
+0

当你阅读'Stream#generate'的javadoc时,你不明白什么? –

回答

6

the documentation for Stream.generate

返回,其中,通过所提供的Supplier生成的每个元件的无限连续的无序的流。这是适合于产生恒定流,随机元素的流等

所以,你必须无限流,其中通过调用Supplier,如果空映射被表示为{}创建的每个新的元素,那么你必须流:

{}, {}, {}, {} ... 

你所寻找的是:

Stream.of(Collections.emptyMap()).forEach(System.out::println); 

这将只打印{}。 (虽然为什么你会希望这有点超出我......)

2

这是个什么文件说,大约Stream.generate(Supplier)

返回一个无限顺序无序的,其中,通过所提供的Supplier生成的每个元素流。这是适合于产生恒定流,随机元素的流等

+0

另外:如果你需要只有一个元素(不是无限流)的流,请尝试[Stream.of(...)](https://docs.oracle.com/javase/8/docs/api/java/util /stream/Stream.html#of-T-)。 – Sasha