有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    IntStream只有one ^{} method,这需要3个参数。我怀疑你在找1-parameter overload in ^{}

    请理解IntStream生成的是原始int数字流,而不是Integer对象

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

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