我正在编写一个从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流编写此代码 - 请记住,我同时在两个数组上进行迭代?
答案 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();
}
}