我可以使用流从字符串列表中拆分项目吗?

时间:2018-09-28 22:20:02

标签: java lambda java-8 java-stream

我正在编写一个简单的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!");

如何使用流和lambda达到相同的结果? 谢谢

1 个答案:

答案 0 :(得分:1)

您已经使用了流,但是我想最大的改进来自将行流转换为更有用的内容:

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

将允许任何密码。您的代码中也存在相同的问题。