【问题标题】:Convert String[] str = {"a","b","c","d","e","f"} to map like {a=b, c=d, e=f} using java stream [duplicate]使用 java 流将 String[] str = {"a","b","c","d","e","f"} 转换为像 {a=b, c=d, e=f} 这样的映射[复制]
【发布时间】:2018-03-28 14:27:02
【问题描述】:

我有下面的代码来实现这个要求,但无法使用 stream 解决,我不知道如何在管道中增加 i

String[] str = {"a","b","c","d","e","f"};
    Map<String, String> strMap = new HashMap<>();
    int i = 0;
    while(i< str.length && i +1 < str.length) {
        strMap.put(str[i],str[i+1]);
        i +=2;          
    } 

【问题讨论】:

标签: java java-8 java-stream


【解决方案1】:

你不能用一个简单的str流来做到这一点,但你可以用一个索引流来模拟你的循环:

Map<String, String> strMap = IntStream.range(0, str.length - 1)
        .filter(i -> i % 2 == 0)
        .boxed()
        .collect(Collectors.toMap(i -> str[i], i -> str[i + 1]));

【讨论】:

  • 谢谢!很有帮助
【解决方案2】:

这有点小技巧,但您可以使用IntStream 生成索引(在0 和数组长度之间),过滤掉奇数索引,然后使用forEach 填充strMap - 喜欢,

String[] str = { "a", "b", "c", "d", "e", "f" };
Map<String, String> strMap = new HashMap<>();
IntStream.range(0, str.length).filter(i -> i % 2 == 0)
        .forEach(i -> strMap.put(str[i], str[i + 1]));
System.out.println(strMap);

哪些输出(根据要求)

{a=b, c=d, e=f}

【讨论】:

  • 谢谢!解决了我的问题:)
  • IntStream.range(0, str.length/2).map(i -&gt; i*2) 执行较少的操作,但另一方面,当数组长度为奇数时不会快速失败。
  • @Holger OP 的版本在奇数长度上也不会失败。
  • @shmosel:但我认为错误输入失败是件好事。
  • @Holger 我一般同意,但如果没有更多上下文,很难宣布它格式错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2012-01-27
  • 2018-05-07
  • 2019-01-07
相关资源
最近更新 更多