在Java 8中,如何一次遍历两个数组?

时间:2016-11-07 20:33:44

标签: java arrays java-stream

我正在编写一个从CSV文件中获取数据的Java程序。对于每一行数据,我需要使用相应的标题作为键将每个数据元素放入映射中。例如,headerRow [7]和dataElements [7]应该是地图中的键值对。

以下是传统上使用Java编写的代码:

private Map<String, Double> readLine(String[] headerRow, String[] dataElements) {
    Map<String, Double> headerToDataMap = new HashMap<>(); 
    for (int i=0; i < nextLine.length; i++) {
        headerToDataMap.put(headerRow[i], Double.valueOf(dataElements[i]));
    }
    return headerToDataMap;
}

有没有办法可以使用Java 8流编写此代码 - 请记住,我同时在两个数组上进行迭代?

2 个答案:

答案 0 :(得分:7)

你可以在vanilla Java 8中得到最接近的东西

 IntStream.range(0, nextLine.length())
    .boxed()
    .collect(toMap(i -> headerRow[i], i -> dataElements[i]));

答案 1 :(得分:1)

您可以使用 BiFunction 界面制作更长的内容。

private Map<String, Double> readLine(String[] headerRow, String[] dataElements) {
        Map<String, Double> headerToDataMap = new HashMap<>();  
        BiFunction<String,String, KeyValue> toKeyValuePair = (s1,s2) -> new KeyValue(s1,s2);
        IntStream.range(0, nextLine.length)
                .mapToObj(i -> toKeyValuePair.apply(headerRow[i], dataElements[i]) )
                .collect(Collectors.toList())
                .stream()
                .forEach(kv -> {
                    headerToDataMap.put(kv.getKey(), Double.valueOf(kv.getValue()));
                });
        return headerToDataMap;
    }

KeyValue类型是一个简单的键值实例生成器(下面的代码)

private class KeyValue {
        String key;
        String value;
        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public KeyValue(String key, String value) {
            super();
            this.key = key;
            this.value = value;
        }
        public KeyValue() {
            super();
        }       
    }