如何重写此代码以使用Stream和功能API?

时间:2018-12-24 06:21:25

标签: java java-8 functional-programming java-stream

我一直在尝试重写以下内容以使用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编写此代码?

1 个答案:

答案 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[]
  • 过滤它们以保留长度恰好为2的元素
  • 然后调用forEach将函数应用于每个元素。