【问题标题】:Produce a Map from an IntStream of keys从键的 IntStream 生成 Map
【发布时间】: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 -&gt; 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


【解决方案1】:

IntStream只有one collect method,它需要3个参数。我怀疑你正在寻找1-parameter overload in Stream

了解IntStream 生成原始int 数字流,而不是Integer 对象。

调用.boxed() 会调用auto-boxing(参见tutorial)以将每个原语int 包装为Integer 对象。这使得Stream&lt;Integer&gt; 而不是IntStream

Map < Integer, UUID > map =
    ThreadLocalRandom
            .current()
            .ints( initialCapacity )
            .boxed()                                // Add this call
            .collect(
                    Collectors.toMap(
                            Function.identity() ,
                            x -> UUID.randomUUID()
                    )
            );

【讨论】:

猜你喜欢
  • 2023-03-29
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多