我一直在尝试重写以下内容以使用Stream API。我似乎无法弄清楚如何进入Map(或字段)为System.setProperty(k,v)设置键值对
我的数据只是行与行之间有一个空格,它们分别拆分为键和值:
foo bar
mykey myvalue
nextkey nextvalue
我的工作源代码在这里:
try {
Scanner scanner = new Scanner(Paths.get("/path/to/file.txt"));
while(scanner.hasNextLine()){
String line = scanner.nextLine();
String[] array = line.split(" ");
if(array.length == 2){
System.setProperty("twitter4j.oauth." + array[0], array[1]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
在这里放置一个破碎的示例,尽管我一直在地图上(gro吟)试图用流来编写它,但这是它的一个迭代,只是为了演示我尝试了:-p
Stream<String> lines = null;
try {
lines = Files.lines(Paths.get("/Users/bellis/dev/data/twitter.txt"));
} catch (IOException e) {
e.printStackTrace();
}
String[] words = lines.collect((Collectors.joining("\n"))).split(" ");
System.out.println("twitter4j.oauth." + words[0] + " " + words[1]);
上面的内容当然是不正确的,我知道有很多更好的方法可以使用函数和其他常见的Stream习惯用法来编写它,但是我似乎无法正确地做到这一点。 您如何建议使用Stream和功能性API编写此代码?
答案 0 :(得分:5)
您的串流尝试还算完成。这就是您的命令性代码。
try (Stream<String> stream = Files.lines(Paths.get("/path/to/file.txt"))) {
stream.map(line -> line.split(" "))
.filter(array -> array.length == 2)
.forEach(array -> System.setProperty("twitter4j.oauth." + array[0], array[1]));
} catch (IOException e) { e.printStackTrace(); }
String[]
forEach
将函数应用于每个元素。