java8转换字符串数组来映射(奇数索引是键,偶数索引是值)

时间:2016-01-01 12:03:51

标签: java java-8

现在我有一个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]);
}

4 个答案:

答案 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]))
          ;