java从一个INT密钥流生成一个映射
我知道我可以初始化一个^{
int initialCapacity = 3;
Map < Integer, UUID > map = new HashMap <>( initialCapacity );
IntStream numbers = ThreadLocalRandom.current().ints( initialCapacity );
numbers.forEach( number -> map.put( number , UUID.randomUUID() ) );
转储到控制台
System.out.println( "map = " + map );
map = {-14054365=ee739423-1200-45e6-80da-d167ce2e2b98, -1079671217=ba0096fe-b32f-4ebf-a163-114fcb679992, -404094411=f900052b-8a8d-4e66-b808-618fbc7e115f}
➥ 我想知道是否有办法让流生成Map
对象,而不是填充预先存在的映射
我不在乎这是不是明智的做法。我只是好奇语法和如何使用^{
我知道^{Function.identity()
是使用我们的IntStream
生成的每个数字作为键的正确方法。然后我尝试UUID.randomUUID()
或p -> UUID.randomUUID()
为每个映射条目生成值
int initialCapacity = 3;
Map < Integer, UUID > map =
ThreadLocalRandom
.current() // Returns a random number generator.
.ints( initialCapacity ) // Returns an `IntStream`.
.collect(
Collectors.toMap(
Function.identity() , // Generate map key (?)
x -> UUID.randomUUID() // Generate map value (?)
)
);
但是我在IDE中得到一个错误,它说:
Expected 3 arguments but found 1
我找到了带有两个参数的Collectors.toMap
示例,一个用于键,一个用于值,以生成每个映射条目。所以我不明白为什么坚持使用第三个参数来调用方法
# 1 楼答案
IntStream
只有one ^{请理解
IntStream
生成的是原始int
数字流,而不是Integer
对象调用
.boxed()
调用auto-boxing(参见tutorial)将每个原语int
包装为Integer
对象。这使得Stream<Integer>
而不是IntStream