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

标签 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 获得相同的结果? 谢谢

最佳答案

您已经使用了流,但我认为最大的改进来自于将行流转换为更可用的东西:

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() 并仅保留正确的密码/用户行,然后对流中的元素进行计数,但在我看来,这看起来非常难看。

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

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

关于java - 我可以使用流从字符串列表中拆分项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52563303/

相关文章:

c# - 如何按多个通用 linq 表达式分组

c++ - 如何创建一个充满 C 风格函数指针和 lambda 的 vector (有和没有捕获)

haskell - 将函数应用于haskell中的每个参数

java - 使用另一个列表中的值修改列表中的对象的最佳方法

performance - 如何使用 BigDecimals 避免巨大的 if 条件?

java - Lambda 表达式示例在 Java 8 中不起作用

java - Ant + 保留控制值

java - 在循环内设置文本

java - 如何转换 moxy json 输出?

java - 在运行时切换 WebDriver 的 native 事件功能