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