如何用Java Stream API替换传统for循环实现数组赋值?
用Java Stream API替换for循环实现Map转数组
先说明你现有代码里的两个问题:
people.size写法错误,应该调用people.size()方法获取Map的元素数量- 原for循环从
i=1开始且判断条件为i < names.length,会导致两个问题:一是数组索引0始终为空,二是漏掉Map中key为5的元素(因为names.length是5,i最大到4)
以下是几种正确的Stream API实现方式:
推荐写法(函数式风格,无需手动初始化数组)
这种方式直接生成按key升序排列的value数组,避免索引操作的错误:
String[] names = IntStream.rangeClosed(1, people.size()) .mapToObj(people::get) .toArray(String[]::new);
IntStream.rangeClosed(1, people.size())生成1到5的整数流,对应Map的key值mapToObj(people::get)将每个key映射为对应的valuetoArray(String[]::new)把流转换为String数组,数组长度自动匹配元素数量
保留原数组结构的写法(需注意索引越界问题)
如果一定要手动初始化数组并保持原逻辑(比如保留索引0为空),需要先修正数组长度避免越界,再用Stream赋值:
// 数组长度设为people.size()+1,让索引1-5对应key1-5 String[] names = new String[people.size() + 1]; IntStream.rangeClosed(1, people.size()) .forEach(i -> names[i] = people.get(i));
IntStream.rangeClosed(1, people.size())生成1到5的索引,确保每个key都被处理forEach遍历索引并给数组对应位置赋值
内容的提问来源于stack exchange,提问作者Dmitriy Dmitruk
相关产品推荐
相关产品推荐

