我正在编写一个简单的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达到相同的结果? 谢谢
答案 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
将允许任何密码。您的代码中也存在相同的问题。