Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Lambda_Java 8_Java Stream - Fatal编程技术网

Java8流中的字符串操作

Java8流中的字符串操作,java,string,lambda,java-8,java-stream,Java,String,Lambda,Java 8,Java Stream,我有一连串的弦,像- Token1:Token2:Token3 这里的:“是分隔符。此处,Token3字符串可能包含分隔符,也可能不存在。 我们必须将此流转换为以Token1为键的map,值为两个字符串的数组-array[0]=Token2和array[1]=Token3如果Token3存在,否则null。 我试过类似的东西- return Arrays.stream(inputArray) .map( elem -> elem.split(":"))

我有一连串的弦,像-
Token1:Token2:Token3
这里的
:“
是分隔符。此处,
Token3
字符串可能包含分隔符,也可能不存在。 我们必须将此流转换为以Token1为键的map,值为两个字符串的数组-
array[0]=Token2
array[1]=Token3
如果
Token3
存在,否则
null
。 我试过类似的东西-

return Arrays.stream(inputArray)
            .map( elem -> elem.split(":"))
            .filter( elem -> elem.length==2 )
            .collect(Collectors.toMap( e-> e[0], e -> {e[1],e[2]}));
但它不起作用。除此之外,如果Token3不存在或包含分隔符,则不处理这种情况


如何在Java8 lambda表达式中实现它?

您可以将每个输入字符串映射到正则表达式
匹配器
,然后只保留那些通过
toMap
收集器使用
Matcher.group()
方法实际匹配和收集的字符串:

Map<String, String[]> map = Arrays.stream(inputArray)
    .map(Pattern.compile("([^:]++):([^:]++):?(.+)?")::matcher)
    .filter(Matcher::matches)
    .collect(Collectors.toMap(m -> m.group(1), m -> new String[] {m.group(2), m.group(3)}));

同样的问题也可以通过
String.split
解决。您只需使用两个arg split版本,并指定最多需要多少个部件:

Map<String, String[]> map = Arrays.stream(inputArray)
    .map(elem -> elem.split(":", 3)) // 3 means that no more than 3 parts are necessary
    .filter(elem -> elem.length >= 2)
    .collect(Collectors.toMap(m -> m[0], 
                              m -> new String[] {m[1], m.length > 2 ? m[2] : null}));
Map Map=Arrays.stream(inputArray)
.map(elem->elem.split(“:”,3))//3表示不需要超过3个部分
.filter(元素->元素长度>=2)
.collect(收集器.toMap(m->m[0],
m->新字符串[]{m[1],m.length>2?m[2]:null});

结果是一样的。

您可以通过以下方式实现您想要的:

    return Arrays.stream(inputArray)
            .map(elem -> elem.split(":", 3)) // split into at most 3 parts
            .filter(arr -> arr.length >= 2)  // discard invalid input (?)
            .collect(Collectors.toMap(arr -> arr[0], arr -> Arrays.copyOfRange(arr, 1, 3)));  // will add null as the second element if the array length is 2

两种解决方案都给出了错误-lambda表达式中的返回类型不正确:String无法转换为String[]@Abhijeetsrivastava是否确定方法的返回值为
Map
?现在可能是
Map
Map<String, String[]> map = Arrays.stream(inputArray)
    .map(elem -> elem.split(":", 3)) // 3 means that no more than 3 parts are necessary
    .filter(elem -> elem.length >= 2)
    .collect(Collectors.toMap(m -> m[0], 
                              m -> new String[] {m[1], m.length > 2 ? m[2] : null}));
    return Arrays.stream(inputArray)
            .map(elem -> elem.split(":", 3)) // split into at most 3 parts
            .filter(arr -> arr.length >= 2)  // discard invalid input (?)
            .collect(Collectors.toMap(arr -> arr[0], arr -> Arrays.copyOfRange(arr, 1, 3)));  // will add null as the second element if the array length is 2