java 集合分割和並行處理
阿新 • • 發佈:2019-01-04
在專案中經常會遇到一個很大的List集合需要處理,如果直接迴圈遍歷的話效能會很差,需要考慮對list進行處理,本次提供一種思路,將大集合拆分為多個小的集合,同時對這些小集合進行並行處理;
下面提供兩種集合分割的方法:
一、將一個list均分成n個list
/**
* 將一個list均分成n個list
*
* @param source
* @param n : 小集合的個數
* @return
*/
public <T> List<List<T>> subWithNum(List<T> source, int n) {
List<List<T>> result = new ArrayList<List<T>>();
int remaider = source.size() % n; // (先計算出餘數)
int number = source.size() / n; // 然後是商
int offset = 0;// 偏移量
for (int i = 0; i < n; i++) {
List<T> value = null;
if (remaider > 0) {
value = source.subList(i * number + offset, (i + 1 ) * number + offset + 1);
remaider--;
offset++;
} else {
value = source.subList(i * number + offset, (i + 1) * number + offset);
}
result.add(value);
}
return result;
}
二、將一個list按照指定大小分割
/**
* 按指定大小,分隔集合,將集合按規定個數分為多個部分
*
* @param source
* @param len:集合的長度
* @return
*/
public <T> List<List<T>> subWithLen(List<T> source, int len) {
if (source == null || source.size() == 0 || len < 1) {
return null;
}
List<List<T>> result = new ArrayList<List<T>>();
int count = (source.size() + len - 1) / len;
for (int i = 0; i < count; i++) {
List<T> value = null;
if ((i + 1) * len < source.size()) {
value = source.subList(i * len, (i + 1) * len);
} else {
value = source.subList(i * len, source.size());
}
result.add(value);
}
return result;
}
利用java 8 Stream流的方式對list併發遍歷
list.parallelStream().parallel().forEach((number) -> {
System.out.println(number);
});