В Java 7 вы не будете делать лучше, чем два for
цикла.Я не стал бы беспокоиться о чем-то другом.
В Java 8 вы можете использовать потоки, чтобы сгладить это:
private static int count(Statement stmt) {
return stmt.getInvAccount().stream()
.filter(Objects::nonNull)
.flatMap(InvestmentAccount::getSecAccountStmt)
.filter(Objects::nonNull)
.flatMap(SecurityStatement::getTransactionStatement)
.count();
}
Я бы посоветовал вам избавиться от пустых проверок.Если вы собираетесь игнорировать нули, лучше просто ожидать, что они не будут вставлены в первую очередь.Полагаю, это избавит вас от множества дополнительных if
проверок в вашем коде.
Я бы также рекомендовал вам не сокращать ваши переменные и методы.Поясните «заявление» и «инвестиции» и тому подобное.Сокращения труднее читать, и краткость на самом деле не является победой.
Аналогичным образом, попробуйте использовать более описательные имена методов.countTransactions
лучше для основного метода.И для различных методов получения методы, которые возвращают списки, должны быть множественного числа: «getAccounts», а не «getAccount».Обратите внимание, как получатели теперь соответствуют именам классов;если вы знаете имя класса, вы знаете имя получателя.Вам не нужно угадывать, сокращен ли один или другой:
private static int countTransactions(Statement statement) {
return statement.getInvestmentAccounts().stream()
.flatMap(InvestmentAccount::getSecurityStatements)
.flatMap(SecurityStatement::getTransactionStatements)
.count();
}