使用 Java 中的列表值将 List<String> 转换为 Map<String, String> 8

Convert a List<String> to Map<String, String> using the list values in Java 8

我有一个列表,我正在尝试使用 Java 8.

将其转换为 Map

名单如下

List<String> data = Arrays.asList("Name", "Sam", "Class", "Five", "Medium", "English")

我想要一个 Map 这样键值对就像

{{"Name", "Sam"}, {"Class", "Five"}, {"Medium", "English"}}

我试图在 Java 8 中实现这一点并尝试使用 Instream.range() 但没有得到确切的结果。

IntStream.range(0, data.size() - 1).boxed()
                .collect(Collectors.toMap(i -> data.get(i), i -> data.get(i + 1)));

上面代码的问题是结果也给出了输出 {"Sam", "Class"}

这里的问题是,您要遍历 每个 索引,而您只想遍历所有其他索引。您可以过滤奇数,将 .filter(i->i%2==0) 添加到您的流中 - 或者使用 IntStream.iterate() 直接获取您想要的数字:

IntStream.iterate(0, i->i<data.size()-1,i->i+2)

这是一种方法。

  • 0 to size/2.
  • 生成一系列值 i
  • 然后使用 i*2i*2 + 1 作为列表的索引。
List<String> data = Arrays.asList("Name", "Sam", "Class",
        "Five", "Medium", "English");

Map<String, String> map = IntStream
        .range(0,data.size()/2).boxed()
        .collect(Collectors.toMap(i -> data.get(i*2),
                i -> data.get(i*2+1)));

map.entrySet().forEach(System.out::println);

打印

Medium=English
Class=Five
Name=Sam

您必须每 2 个元素迭代一次,因此 步骤3 等于 6(列表大小)/ 2(步长).

所以按步骤迭代而不是按元素迭代,你可以在收集阶段找到每个步骤的两个元素。这是示例:

IntStream.range(0, data.size() / 2)
         .boxed()
         .collect(Collectors.toMap(i -> data.get(i * 2), i -> data.get(i * 2 + 1)));