这段代码非常快,但是我想不使用HashMap来使其更快。
我有一个帐户列表,目前正在循环查看它们是否检查account.getAccountNumber().equals(accountNumber)
是否有一种方法可以使用Java 8进行改进?
public Account getAccountFromCustomer(String customerID, String accountNumber) {
List<Account> accounts = getAccountsFromCustomer(customerID);
for(Account account : accounts) {
if(account.getAccountNumber().equals(accountNumber)) {
return account;
}
}
return null;
}
答案 0 :(得分:2)
也许我理解错了,但是如果我使用parallel
可以改善性能:
@Test
public void testIt(){
Integer accountNumberLookingFor = 50001;
List<Account> accounts = new ArrayList<>();
for (int i = 0 ; i < 100000; i++){
accounts.add(new Account(i));
}
Stopwatch stopwatch = Stopwatch.createStarted();
accounts.stream().filter(account -> account.accountNumber.equals(accountNumberLookingFor)).findFirst().orElse(null);
System.out.println("Time of execution in milliseconds:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
stopwatch = Stopwatch.createStarted();
accounts.stream().parallel().filter(account -> account.accountNumber.equals(accountNumberLookingFor)).findFirst().orElse(null);
System.out.println("Time of execution in milliseconds:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
}
private class Account{
Integer accountNumber;
private Account(Integer accountNumber){
this.accountNumber = accountNumber;
}
@Override
public String toString(){
return "Account number: ".concat(String.valueOf(accountNumber));
}
}
导致:
Time of execution in milliseconds without parallel:50
Time of execution in milliseconds with parallel:9
答案 1 :(得分:1)
我不熟悉本示例中使用的类,但是从算法的角度看,您似乎正在执行以下操作:
// Create an unordered list.
getAccountsFromCustomer();
// Run through it
for(Account account : accounts) {
if matches()...
}
此算法的速度为O(n)
。
如果将结果放在有序列表中,则可以使用二进制搜索。您将需要一种O(n*log n)
算法来创建该列表(不仅在列表的末尾添加帐户名,而且还按字母顺序排序),然后使用二进制搜索在其中查找帐户名该列表(效果O(log n)
。
显然,您需要两个独立的功能: