当前位置: 首页 > 知识库问答 >
问题:

如何在使用集合时保持列表的迭代顺序。toMap()在流上?

姚烨
2023-03-14

我正在从列表中创建映射,如下所示:

List<String> strings = Arrays.asList("a", "bb", "ccc");

Map<String, Integer> map = strings.stream()
    .collect(Collectors.toMap(Function.identity(), String::length));

我希望保持与<code>列表收集器创建LinkedHashMap。toMap()方法?

共有3个答案

商迪
2023-03-14

这个问题的正确解决方案是

当前----

<代码>地图

对----

<代码>地图

这将有所帮助。

高茂
2023-03-14

制作您自己的供应商累加器组合器

List<String> myList = Arrays.asList("a", "bb", "ccc"); 
// or since java 9 List.of("a", "bb", "ccc");
    
LinkedHashMap<String, Integer> mapInOrder = myList
                        .stream()
                        .collect(
                          LinkedHashMap::new,                           // Supplier LinkedHashMap to keep the order
                          (map, item) -> map.put(item, item.length()),  // Accumulator
                          Map::putAll);                                 // Combiner

System.out.println(mapInOrder);  // prints {a=1, bb=2, ccc=3}
严升
2023-03-14

<code>收集器的2参数版本。toMap()使用<code>哈希映射:

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(
    Function<? super T, ? extends K> keyMapper, 
    Function<? super T, ? extends U> valueMapper) 
{
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

要使用4参数版本,可以替换:

Collectors.toMap(Function.identity(), String::length)

跟:

Collectors.toMap(
    Function.identity(), 
    String::length, 
    (u, v) -> {
        throw new IllegalStateException(String.format("Duplicate key %s", u));
    }, 
    LinkedHashMap::new
)

或者更简洁一点,编写一个新的< code > tolink dmap()方法,并使用:

public class MoreCollectors
{
    public static <T, K, U> Collector<T, ?, Map<K,U>> toLinkedMap(
        Function<? super T, ? extends K> keyMapper,
        Function<? super T, ? extends U> valueMapper)
    {
        return Collectors.toMap(
            keyMapper,
            valueMapper, 
            (u, v) -> {
                throw new IllegalStateException(String.format("Duplicate key %s", u));
            },
            LinkedHashMap::new
        );
    }
}
 类似资料:
  • 问题内容: 我创建一个从如下: 我想保持与中相同的迭代顺序。如何使用该方法创建一个? 问题答案: 在2个参数的版本采用的是: 要使用4参数版本,您可以替换: 与: 为了使它更简洁,请编写一个新方法并使用该方法:

  • 问题内容: List rateList = guestList.stream() .map(guest -> buildRate(ageRate, guestRate, guest)) .collect(Collectors.toList()); 在上面的代码中,可以通过内部方法的索引。我在构建时还需要传递索引,但无法通过获取索引。 问题答案: 您尚未提供的签名,但是我假设您希望首先传递元素的索引

  • 问题内容: 为什么某些集合数据结构不能保持插入顺序?与保持插入顺序相比,有什么特别的事情?如果不维持订单,我们会有所收获吗? 问题答案: 性能。如果您想要原始的插入顺序,则可以使用LinkedXXX类,它们在插入顺序中维护着一个附加的链表。大多数时候,您都不在乎,因此您使用HashXXX,或者想要自然订单,因此您使用TreeXXX。在这两种情况下,您为什么都要支付链接列表的额外费用?

  • 我有一个映射,它包含日期作为键和(另一个字符串作为键和列表作为值的映射)作为值。,我想填充另一个将String作为键和double作为值的映射。FlexiServer的内容包括 因此,基本上,我想首先迭代外部映射以获得内部映射,然后迭代内部映射以获得FlexiServers列表,并填充新的映射,其中服务器号作为键,数量列表作为值。我如何使用Java8流来实现这一点呢? 我尝试使用for循环,但我希

  • 问题内容: 好像生成带有对象的随机分布字段的JSON代码。有办法解决字段顺序问题吗? 字符串jsonRequest可以是: (正确) (顺序错误) 问题答案: 如果GSON不支持字段顺序的定义,那么其他库也可以。例如,Jackson允许使用@JsonPropertyOrder进行定义。对我来说,必须指定自己的自定义序列化程序似乎很繁琐。 是的,我同意按照JSON规范,应用程序不应期望字段的特定顺序

  • 我试图用`stream,特别是嵌套的foreach循环,将以下代码重构为lambda表达式: 我的开头是: