如何在Java 8中从管道单独的CSV返回地图

时间:2018-09-19 11:15:53

标签: java dictionary java-8 java-stream

public Map<Long, String> getReports()
{
    // 123434|str1,123434|str2,123434|str3
    HashMap<Long, String> map = new HashMap<Long, String>();
    List<String> items =  Arrays.asList( reports.split( "," ) );
    for( String i : items )
    {
        String parts[] = i.split( "|" );
        map.put( Long.parseLong( parts[0] ), parts[1] );
    }
    return map;
}

想知道如何使用Java8流重写它?

2 个答案:

答案 0 :(得分:3)

您需要流传输拆分数组,使用map对其进行操作,最后将其收集到地图中:

return Arrays.stream(reports.split( "," ))
             .map(s-> s.split("|"))
             .collect(Collectors.toMap(p-> Long.parseLong(p[0]), p-> p[1]));

答案 1 :(得分:0)

@Squiggs:地图-不允许重复的键。也请查看下面的代码。我认为这也可能对您有所帮助,或者给您更多信息。我将输入源字符串更改为1234345|str1,1234346|str2,1234347|str3,并用多余的行进行了更新,尤其是sysout,以打印内存值。

String source = "1234345|str1,1234346|str2,1234347|str3";

    return Arrays.stream(source.split(","))
            .map(s -> s.split("\\|"))
            .collect(  Collectors.toMap ( s -> { System.out.println(" 1: "+Long.valueOf ( s[0]));  return Long.valueOf ( s[0]);} ,
                                          s -> { System.out.println(" 2: "+s[1]);return s[1]; },
                                          ( (v1, v2) -> {   System.out.println("------ line 131 : "+v1 +"  "+v2); return v2 ;}  )
                                        )
                     );

使用上述源,您得到的输出为:{1234346=str2, 1234347=str3, 1234345=str1}

如果将源更改为source = "123434|str1,123434|str2,123434|str3",则输出为{123434=str3}