Java 如何以功能性的方式替换循环中的循环?
我有这样的代码:Java 如何以功能性的方式替换循环中的循环?,java,Java,我有这样的代码: List<Account> myAccounts = new ArrayList<>(); List<String> numbers = new ArrayList<>(); List<Account> resultList = new ArrayList<>(); for (String number : numbers) { for (Account
List<Account> myAccounts = new ArrayList<>();
List<String> numbers = new ArrayList<>();
List<Account> resultList = new ArrayList<>();
for (String number : numbers) {
for (Account account : myAccounts) {
if(number.equals(account.getNumber())){
resultList.add(account);
}
}
}
List myAccounts=new ArrayList();
列表编号=新的ArrayList();
List resultList=new ArrayList();
用于(字符串编号:数字){
对于(帐户:myAccounts){
if(number.equals(account.getNumber())){
结果列表.添加(帐户);
}
}
}
我尝试使用指定的数字获取特定的帐户,但我通过循环所有数字并与帐户编号进行比较来实现这一点。我怎样才能在功能性风格中做到这一点?我不是问如何把它变成一个函数,而是问如何在每次不运行两个循环的情况下获得相同的结果。在函数方法中,您可以从for循环中构造一个方法,如:
public void compareNumbers(List<String> numbers, List<Account> resultList){
for (String number : numbers) {
for (Account account : myAccounts) {
if(number.equals(account.getNumber())){
resultList.add(account);
}
}
}
public void compareNumbers(列表编号、列表结果列表){
用于(字符串编号:数字){
对于(帐户:myAccounts){
if(number.equals(account.getNumber())){
结果列表.添加(帐户);
}
}
}
在函数方法中,您可以从for循环中构造一个方法,如下所示:
public void compareNumbers(List<String> numbers, List<Account> resultList){
for (String number : numbers) {
for (Account account : myAccounts) {
if(number.equals(account.getNumber())){
resultList.add(account);
}
}
}
public void compareNumbers(列表编号、列表结果列表){
用于(字符串编号:数字){
对于(帐户:myAccounts){
if(number.equals(account.getNumber())){
结果列表.添加(帐户);
}
}
}
列出我的帐户=新建ArrayList();
列表编号=新的ArrayList();
List resultList=myAccounts.stream()
.filter(account->number.contains(account.getNumber()))
.collect(Collectors.toList());
您可以使用它。唯一的要求是您至少应该使用Java8List myAccounts=new ArrayList();
列表编号=新的ArrayList();
List resultList=myAccounts.stream()
.filter(account->number.contains(account.getNumber()))
.collect(Collectors.toList());
您可以使用它。唯一的要求是您至少应该使用Java8。实现这一点的最佳方法是将您的帐户对象加载到sql lite数据库中。(或者将其添加到您当前的数据库中,如果您已经有了) 然后,一旦将所有帐户对象存储在数据库中,就可以编写一个查询来列出具有匹配号码的帐户 下面是一个更完整的示例,介绍如何构建从创建数据库到创建对象以及最终查询对象的所有内容
https://www.androidauthority.com/creating-sqlite-databases-in-your-app-719366/
实现这一点的最佳方法是将您的帐户对象加载到SQLLite数据库中。(或者,如果您已有一个数据库,则将其添加到当前数据库中) 然后,一旦将所有帐户对象存储在数据库中,就可以编写一个查询来列出具有匹配号码的帐户 下面是一个更完整的示例,介绍如何构建从创建数据库到创建对象以及最终查询对象的所有内容
https://www.androidauthority.com/creating-sqlite-databases-in-your-app-719366/
像这样试试
List<Account> results = numbers.stream().flatMap(numb -> myAccounts
.stream()
.filter(acct->numb.equals(acct.getNumber()))
.collect(Collectors.toList());
List results=numbers.stream().flatMap(numb->myAccounts
.stream()
.filter(帐户->numb.equals(帐户getNumber())
.collect(Collectors.toList());
像这样试试
List<Account> results = numbers.stream().flatMap(numb -> myAccounts
.stream()
.filter(acct->numb.equals(acct.getNumber()))
.collect(Collectors.toList());
List results=numbers.stream().flatMap(numb->myAccounts
.stream()
.filter(帐户->numb.equals(帐户getNumber())
.collect(Collectors.toList());
您是在询问如何将其转换为函数,还是在每次检查时不必运行两个循环就可以得到相同的结果?@NathanWalsh每次不必运行两个循环就可以使用streams api。例如:List List List=new ArrayList();List.stream().filter(i->true)。forEach(i->List.add(i));或者您甚至可以用简单的collect@merc-你说的“不必每次运行两个循环”是什么意思?你的意思是不需要为每个元素迭代所有元素吗?因为Naga的答案在性能方面与嵌套循环几乎没有什么不同。唯一的区别是在找到匹配项后它不会继续,但你可以很容易地在if中设置一个中断,以实现这一点。你在问如何实现它吗或者如何在每次检查时不必运行两个循环就能得到相同的结果?@NathanWalsh每次不必运行两个循环就可以使用streams api。例如:List List=new ArrayList();List.stream().filter(i->true)。forEach(i->List.add(i));或者您甚至可以用简单的collect@merc-你说的“不必每次运行两个循环”是什么意思?您的意思是不需要对每个元素迭代所有元素吗?因为Naga的答案在性能方面几乎与嵌套循环没有什么不同。唯一的区别是,在找到匹配项后,它不会继续,但您可以很容易地在if中放入一个break
,以实现这一点。好的,但我的意思是如何替换循环中循环你必须使用循环,否则你将如何比较这些值?我认为这是可能的:如果你感兴趣,你可以读入lambda。但是我不确定你是否可以用lambda.Streams api迭代数组。就是这样,看看其他答案。他要求使用函数方法,但这不是函数方法。好的,bu我的意思是如何在循环中替换循环你必须使用循环,否则你将如何比较值?我认为这是可能的:如果你感兴趣的话,你可以读入lambda。但是我不确定你是否可以用lambda.Streams api迭代数组。就是这样,看看其他答案。他要求一种函数方法,而我它不起作用。@merc angelnumbers
可能应该是一个Set
,因为Set通常优化包含的方法最多。例如,HashSet#contiains复杂性接近O(1)。100%