映射Java8的字符串列表

时间:2018-09-27 00:08:07

标签: java lambda java-8 java-stream functional-interface

我的应用程序中有一个String列表。每个字符串实际上是由“。”连接的2个不同字符串的输出。 例如Stack.Overflow

现在,我正在尝试将此列表转换为Map,键为字符串的第一部分,值为第二部分。例如key = Stack和value = Overflow

我正在做这样的事情:

List<String> sampleList = someList here;

Map<String, String> outputMap= sampleList .stream().collect(
            Collectors.toMap(s->s.toString().split("\\.")[0],
s->s.toString().split("\\.")[1]));

如何实现?谢谢

它似乎对我不起作用。见下文:

List<String> sample = new ArrayList<>();
    sample.add("12345.22-JUN-18");
    sample.add("12345.22-JUN-18");
    sample.add("45678.25-JUN-18");

    sample.add("23456.25-JUN-18");
    sample.add("34567.25-JUN-18");
    sample.add("67890.25-JUN-18");
    sample.add("45678.25-JUN-18");
    sample.add("23456.26-JUN-18");

    Pattern pattern = Pattern.compile("[.]");

    Map<String,String> output = sample.stream()
      .map(pattern::split)
      .collect(Collectors.toMap(s -> s[0], s -> s[1]));

It gives me java.lang.IllegalStateException: Duplicate key 22-JUN-18.

为什么以日期为关键?它应该以日期作为值而不是键。

1 个答案:

答案 0 :(得分:1)

假设\\.与单个字符.匹配,我认为您所拥有的没问题。

但是,您可以通过将正则表达式编译为Pattern并使用Stream#map来对其进行清理:

Pattern pattern = Pattern.compile("[.]");

Arrays.asList("Stack.Overflow")
      .stream()
      .map(pattern::split)
      .collect(Collectors.toMap(s -> s[0], s -> s[1]));

输出:

{Stack=Overflow}