Ben*_*Luk 11 java java-8 java-annotations
我有一个方法params是一个大于50000项的列表; 限于业务逻辑,列表必须小于30000,所以我有一个方法在逻辑之前将这个数组拆分为2d数组
public static final <T> Collection<List<T>> partitionBasedOnSize(List<T> inputList, int size) {
AtomicInteger counter = new AtomicInteger(0);
return inputList.stream().collect(Collectors.groupingBy(s -> counter.getAndIncrement() / size)).values();
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的解决方案:
public List<Account> getChildrenList(List<Long> ids) {
List<Account> childrenList = new ArrayList<>();
Collection<List<Long>> childrenId2dList = PartitionArray.partitionBasedOnSize(childrenIdsList, 30000);
for (List<Long> list : childrenId2dList) {
//this is my business logic: start
childrenList.addAll(accountRepository.getAccounts(list));
//this is my business logic: end
}
return childrenAccountsList;
}
Run Code Online (Sandbox Code Playgroud)
我想在方法的顶部创建一个注释,而不是许多重复的代码(每次检查和讨厌......)
在我看来,在这种情况下使用注释有点过度设计(您必须编写注释处理器)。您可以轻松地使用泛型和lambda和/或方法引用来实现您的目标。例如:
更新PartitionArray方法如下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
public class PartitionArray {
private static <T> Collection<List<T>> partitionBasedOnSize(List<T> inputList, int partitionSize) {
Collection<List<T>> collection = new ArrayList<>();
int remainingSize = inputList.size();
int index = 0;
while (remainingSize > partitionSize) {
collection.add(inputList.subList(index, index + partitionSize));
remainingSize -= partitionSize;
index += partitionSize;
}
collection.add(inputList.subList(index, index + remainingSize));
return collection;
}
public static <D, T> List<D> partitionAndDoBusinessFunction(List<T> ids, Function<List<T>, List<D>> businessFunction, int partitionSize) {
List<D> dataList = new ArrayList<>();
Collection<List<T>> idListCollection = partitionBasedOnSize(ids, partitionSize);
for (List<T> idList : idListCollection) {
dataList.addAll(businessFunction.apply(idList));
}
return dataList;
}
}
Run Code Online (Sandbox Code Playgroud)
AccountService然后只需从您的(使用方法参考)中使用它:
import java.util.List;
public class AccountService {
private AccountRepository accountRepository;
public List<Account> getAccounts(List<Long> ids) {
return PartitionArray.partitionAndDoBusinessFunction(ids, accountRepository::getAccounts, 30000);
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用 lambda:
import java.util.List;
public class AccountService {
private AccountRepository accountRepository;
public List<Account> getAccounts(List<Long> ids) {
return PartitionArray.partitionAndDoBusinessFunction(ids, idList -> {
List<Account> accounts = accountRepository.getAccounts(idList);
// do more business on accounts
return accounts;
}, 30000);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |