【问题标题】:Generate map of natural id as key and string as value from list of string in java 8 [duplicate]从Java 8中的字符串列表生成自然ID的映射作为键和字符串作为值[重复]
【发布时间】:2019-10-16 10:20:02
【问题描述】:

假设我有一个字符串列表

List<String> fourthList = Arrays.asList("abc","def","ghi");

我想把它转换成像 {1=abc,2=def,3=ghi} 这样的地图。

Java 中的收集器不允许我这样做,因为它只接受 keyMapper 中的方法。

【问题讨论】:

  • 这个问题之前没有被问过,或者我可能没有找到它。我能够找到转换列表到映射但是在它提到用户类型变量的所有问题中。我只关心字符串类型的列表。
  • Map collect = IntStream.rangeClosed(0, FourthList.size() - 1) .boxed() .collect(Collectors.toMap(i -> i + 1, FourthList: :得到)); System.out.println(collect);

标签: java java-8


【解决方案1】:

根据Hadi J 的评论(推荐),您可以使用:

IntStream.rangeClosed(0, list.size() - 1) 
         .mapToObj(i -> new AbstractMap.SimpleEntry<Integer, String>(i + 1, list.get(i))) 
         .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

另一种解决方法

List<String> list = Arrays.asList("abc", "def", "ghi");

List 转换为Map&lt;Integer, String&gt;,键为整数并以0...n 开头:

AtomicInteger index = new AtomicInteger(0);
Map<Integer, String> map = list.stream()
            .collect(Collectors.toMap(s -> index.incrementAndGet(), Function.identity()));
map.forEach((l, m) -> System.out.println(l + "  " + m));

输出:

1  abc
2  def
3  ghi

我今年早些时候做过类似的Map实践,你可以看看:https://github.com/vishwaratna/ThatsHowWeDoItInJava8/blob/master/src/ListToMapWIthKeyAsInteger.java

【讨论】:

  • 问题是您使用静态变量 k 使得这不是线程安全的,还有许多其他缺点。
  • 线程安全现在不是我关心的问题,反正它很好。
  • 感谢 Vishwa 成功了,但是我对 toMap 签名表示怀疑,因为它接受 Function 作为参数,但是这里它在这里取变量
  • @RahulPyasi ,你是对的 toMap 签名接受 FunctionJava lambda 表达式是 Java 进入函数式编程的第一步。 因此,Java lambda 表达式是一个 函数,它可以在不属于任何类的情况下创建。
  • @VishwaRatna 这是明确的解释。感谢您的信息!
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2021-10-13
相关资源
最近更新 更多