Как я могу переписать этот код для использования Stream и функционального API? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытался переписать нижеприведенное использование Stream API.Я не могу понять, как добраться до карты (или полей), чтобы установить пару значений ключа для 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();
}

Помещение здесь разбитого образца, хотя я был на всем протяженииmap (стон) пытается записать это с помощью потока, но вот одна итерация этого, чтобы продемонстрировать, что я пытался: -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 голосов
/ 24 декабря 2018

Ваша попытка потоковой передачи завершена.это то, что делает ваш императивный код.

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
...