Могу ли я разделить элементы из списка строк, используя потоки? - PullRequest
0 голосов
/ 29 сентября 2018

Я пишу простую программу javaFX, в которой я получаю имя пользователя и пароль из файла и сравниваю их с именем пользователя и паролем, введенными конечным пользователем.Я смог добиться этого с помощью этого кода:

        Stream<String> stream = Files.lines(Paths.get(file));
        lines = stream.collect(Collectors.toList());
        for(String item : lines){
        String[] itemSplitted = item.split("=");
        switch(itemSplitted[0].trim()){
            case "User name":
                if (itemSplitted[1].trim().equals(userName))
                    counter++;
                break;
            case "Password":
                if (itemSplitted[1].trim().equals(password))
                    counter++;
                break;
        }
    }
    if (counter == 2)
        System.out.println("details are correct!!");
    else throw new RuntimeException("Details are not correct!");

Как я могу достичь того же результата, используя потоки и лямбды?Спасибо

1 Ответ

0 голосов
/ 29 сентября 2018

Вы уже используете потоки, но самое большое улучшение, которое я предполагаю, заключается в преобразовании потока строк во что-то более удобное:

void login(String file, String userName, String password) throws IOException {
    Map<String, String> map = Files.lines(Paths.get(file))
        .map(line -> line.split("=", 2))
        .filter(array -> array.length == 2)
        .collect(Collectors.toMap(
                array -> array[0].trim(),
                array -> array[1].trim()));
    if (map.get("User name").equals(userName)
            && map.get("Password").equals(password)) {
        System.out.println("details are correct!!");
    } else throw new RuntimeException("Details are not correct!");
}

Вы можете технически использовать filter () и сохранять только правильный пароль / строки пользователя, затем посчитайте элементы в потоке, но это выглядело бы довольно уродливо. IMO.

long count = Files.lines(Paths.get(file))
    .map(line -> line.split("=", 2))
    .filter(array -> array.length == 2)
    .filter(array -> 
          (array[0].trim().equals("User name") && array[1].trim().equals(userName))
       || (array[0].trim().equals("Password")  && array[1].trim().equals(password))
    )
    .count();
if (count == 2) ...

Это также более подвержено ошибкам, так как файл типа

User name=root
User name=root

допускает любой пароль.Та же проблема существует и в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...