【发布时间】:2020-07-27 17:54:45
【问题描述】:
我知道我可以初始化Map,然后使用流填充它。例如,这里我使用随机数的IntStream 来填充预定义映射的键。
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-4ebc66-186-1861
➥ 我想知道是否有办法让流生成Map 对象,而不是填充预先存在的地图。
我不在乎这是否明智。我只是对语法以及如何使用Collector 感到好奇。
我知道Collectors.toMap 方法。但我似乎无法正确完成语法或语义。我猜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 中收到一条错误消息:
预期有 3 个参数,但找到了 1 个
我发现Collectors.toMap 的示例带有两个参数,一个用于键,一个用于值,以生成每个映射条目。所以我不明白为什么坚持方法调用的第三个参数。
【问题讨论】:
-
@AndyTurner 宾果游戏!那行得通。小心回答这个问题让我接受。或者我的问题是要关闭的重复问题?
标签: java dictionary functional-programming java-stream