我正在编写一个简单的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/