Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
映射Java8的字符串列表_Java_Lambda_Java 8_Java Stream_Functional Interface - Fatal编程技术网

映射Java8的字符串列表

映射Java8的字符串列表,java,lambda,java-8,java-stream,functional-interface,Java,Lambda,Java 8,Java Stream,Functional Interface,我的应用程序中有一个字符串列表。每个字符串实际上是由“.”连接的两个不同字符串的输出。 e、 堆栈溢出 现在,我试图将这个列表转换为一个映射,其中key是字符串的第一部分,value是第二部分。e、 g键=堆栈,值=溢出 我正在做这样的事情: List<String> sampleList = someList here; Map<String, String> outputMap= sampleList .stream().collect( C

我的应用程序中有一个字符串列表。每个字符串实际上是由“.”连接的两个不同字符串的输出。 e、 堆栈溢出

现在,我试图将这个列表转换为一个映射,其中key是字符串的第一部分,value是第二部分。e、 g键=堆栈,值=溢出

我正在做这样的事情:

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 sampleList=someList在这里;
Map 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.
List sample=new ArrayList();
添加样本(“12345.22-JUN-18”);
添加样本(“12345.22-JUN-18”);
添加样本(“45678.25-JUN-18”);
添加样本(“23456.25-JUN-18”);
添加样本(“34567.25-JUN-18”);
添加样本(“67890.25-JUN-18”);
添加样本(“45678.25-JUN-18”);
添加样本(“23456.26-JUN-18”);
Pattern=Pattern.compile(“[.]”);
映射输出=sample.stream()
.map(模式::拆分)
.collect(收集器.toMap(s->s[0],s->s[1]);
它给了我java.lang.IllegalStateException:重复键22-JUN-18。

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

我认为您的数据很好,假设
\\。
与单个字符
匹配

但是,您可以通过将正则表达式编译成
模式
并使用
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}

你的代码有什么问题?它似乎在我的机器上工作您的代码很好,但是您可以通过在管道中更早地调用split来消除两次调用split的不满足需求。它对我不起作用。请参阅我在上述问题中的编辑。@user3262365您有映射到多个值的键(
23456
映射到
25-JUN-18
26-JUN-18
)。你想把它收集到地图上吗?我应该用数字而不是日期来代替。我得到的例外是18年6月22日的重复钥匙。这意味着它试图以日期为关键。不是吗?@user3262365不,你只是用了两次相同的键(
12345
)。解决方案是在收集之前调用
Stream#distinct
,或者将其收集到
映射中。太棒了!!!它成功了。非常感谢雅各布·G,你救了我一天。:)