现在我有一个String数组,
String[] a= {"from","a@a.com","to","b@b.com","subject","hello b"};
来自命令行参数。
我想将其转换为Map,
{"from":"a@a.com","to":"b@b.com","subject":"hello b"}
在java8中存在方便的方式来实现这个吗? 现在我的方式是
Map<String,String> map = new HashMap<>();
for (int i = 0; i < args.length; i+=2) {
String key = args[i].replaceFirst("-+", ""); //-from --> from
map.put(key, args[i+1]);
}
答案 0 :(得分:10)
您可以使用ImageFormat.YUV_420_888
来迭代数组的索引(这是每次处理数组的两个元素所必需的)并使用$('body').on('click','.theClass',function(){
//Your codes
});
收集器。
IntStream
将包含输入数组的每对元素的相应索引。如果数组的长度为奇数,则忽略最后一个元素。
Collectors.toMap
答案 1 :(得分:1)
在Java 8中,您可以使用Stream.iterate
将列表划分为2个元素的子列表
String[] a= {"from","a@a.com","to","b@b.com","subject","hello b"};
Map<String, String> map = Stream.iterate(
Arrays.asList(a), l -> l.subList(2, l.size()))
.limit(a.length / 2)
.collect(Collectors.toMap(
l -> l.get(0).replaceFirst("-+", ""),
l -> l.get(1))
);
使用简单Iterator
Map<String, String> map = buildMap(new HashMap<>(), Arrays.asList(a).iterator());
private static Map<String, String> buildMap(
Map<String, String> map, Iterator<String> iterator) {
if (iterator.hasNext()) {
map.put(iterator.next().replaceFirst("-+", ""), iterator.next());
createMap(map, iterator);
}
return map;
}
答案 2 :(得分:1)
使用Javaslang:
可以做到这一点String[] a= {"from","a@a.com","to","b@b.com","subject","hello b"};
Map<String, String> map = Stream.of(a).grouped(2) // use javaslang.collection.Stream here
.map(group -> group.toJavaArray(String.class))
.toJavaStream() // this is the plain old java.util.Stream
.collect(toMap(tuple -> tuple[0], tuple -> tuple[1]));
grouped
功能将您的信息流分为2个元素组。这些可以转换为字符串数组,这些可以是Map
的基础。可能Javaslang可以让你做得更优雅。
答案 3 :(得分:0)
诀窍是首先加入字符串,然后将其拆分为键/值对,然后任务很简单:
Map<String,String> map = Arrays.stream(
String.join(",", a)
.split(",(?!(([^,]*,){2})*[^,]*$)"))
.map(s -> s.split(","))
.collect(Collectors.toMap(s -> s[0], s -> s[1]))
;