一、list集合分页
/**
* List集合的分页方法,根据传入总共的List集合数据和页码、数据的条数
* @param t 需要进行分页的集合
* @param pageNo 第几页
* @param pageSize 数据的条数
* @return 进过分页之后返回的数据
*/
public static <T> List<T> pageList(List<T> t,int pageNo,int pageSize){
if (CollectionUtils.isEmpty(t)){
t = new ArrayList<T>();
}
if(pageNo <= 0){
pageNo = 1;
}
if (pageSize<=0){
pageSize = 1;
}
//集合总的数据条数
int total = t.size();
//返回参数
List<T> resList = new ArrayList<T>();
// 从第几页开始
int begin = (pageNo-1)*pageSize;
// 结束位置:从开始位置+pageSize,
// 判定是否大于总条数,如果大于就到总条数结束,如果<= 在开始位置+pageSize结束
int end = (((pageNo -1)*pageSize) + pageSize > total ? total:((pageNo -1)*pageSize) +pageSize);
for ( int i = begin; i < end; i++) {
resList.add(t.get(i));
}
return resList;
}
二、一个单元素的结合
List使用Arrays.asList()和Collections.singletonList()方法创建只有一个元素的实例
三、找出两个list集合的不同部分
@SuppressWarnings({ "rawtypes", "unchecked" })
public static Collection getDifferent(Collection collmax, Collection collmin) {
//使用LinkeList防止差异过大时,元素拷贝
Collection csReturn = new LinkedList();
Collection max = collmax;
Collection min = collmin;
//先比较大小,这样会减少后续map的if判断次数
if (collmax.size() < collmin.size()) {
max = collmin;
min = collmax;
}
//直接指定大小,防止再散列
Map<Object, Integer> map = new HashMap<Object, Integer>(max.size());
for (Object object : max) {
map.put(object, 1);
}
for (Object object : min) {
if (map.get(object) == null) {
csReturn.add(object);
} else {
map.put(object, 2);
}
}
for (Map.Entry<Object, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
csReturn.add(entry.getKey());
}
}
return csReturn;
}
四、找出两个list集合的相同部分
方法1:
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<String> list = new ArrayList<>();
if (list1.size()<list2.size()) {
list = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
} else {
list = list2.stream().filter(item -> list1.contains(item)).collect(Collectors.toList());
}
方法3:
public static void main(String[] args) {
// 注意:一定要使用创建对象的格式创建数组
Integer[] a = new Integer[] { 6, 3, 9, 3, 2, 4, 5, 7 };
Integer[] b = new Integer[] { 5, 8, 6, 2, 1, 9 };
List _a = Arrays.asList(a);
List _b = Arrays.asList(b);
// 创建集合
Collection realA = new ArrayList<Integer>(_a);
Collection realB = new ArrayList<Integer>(_b);
// 求交集
realA.retainAll(realB);
System.out.println("交集结果:" + realA);
Set result = new HashSet();
// 求全集
result.addAll(_a);
result.addAll(_b);
System.out.println("全集结果:" + result);
// 求差集:结果
Collection aa = new ArrayList(realA);
Collection bb = new ArrayList(result);
bb.removeAll(aa);
System.out.println("最终结果:" + bb);
/**
* 交集结果:[6, 9, 2, 5] 全集:[1, 2, 3, 4, 5, 6, 7, 8, 9] 最终结果:[1, 3, 4, 7, 8]
*/
}
五、将两个集合合并,去重
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
将两个List 合并
list1.addAll(list2);
List<String> all = list1.stream()
.distinct()
.collect(Collectors.toList());
根据对象属性去重
//第一种方式 使用TreeSet去重
List<User> users = new ArrayList<>();
List<User> user1 = users .stream().collect(
collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(o ->o.getId()))),ArrayList::new));
//第二种方式 使用map去重
List<User> user2 = books.stream()
.filter(distinctByKey(o -> o.getId()))
.collect(Collectors.toList());
六、获取stream 处理集合
// 将结合中对象的某个属性取出来
List<String> userIds= users.stream().map(User::getUserId).collect(Collectors.toList());
// 通过对象的id对集合进行分组
Map<Long, List<Student>> studentMap = students.stream().collect(Collectors.groupingBy(Student::getStudentId));
// 找到集合中对象的某个属性等于某个值的对象
Student student= students.stream().filter(i -> Objects.equals(i.getStudentId(), 2)).findAny().orElse(null);
// 通过对象的某个属性,进行分组
Map<Long, Student > studentMap = students.stream().collect(Collectors.toMap(Student ::getStudentId, (k) -> k));
Map<Long, String> studentMap = students.stream().collect(Collectors.toMap(Student ::getStudentId,Student ::getStudentName));
// 获取对象的某个属性,进行排序
List<String> strings = students.stream().map(item->(item.getStudengNo())).sorted((a, b) -> a.compareToIgnoreCase(b)).collect(Collectors.toList());
// 倒序排序
List<Student> reveredStudents = students.stream().sorted(Comparator.comparing(Student ::getStudentId).reversed()).collect(Collectors.toList());
// 找到对象所在集合中的下标
AtomicInteger index = new AtomicInteger(0);
strings.stream().filter(item ->
{
index.getAndIncrement();
return StrUtil.equals("201417023401", item);
}
).findFirst();
// i 就是学生编号对应的对象,在集合中的下标了
int i = index.intValue() - 1;
// 集合中按照对象的多个属性,进行分组,然后根据某个属性求和
Map<Date, Map<String, Double>> stuCollect = stuData.stream().collect(Collectors.groupingBy(Student::getDate,
Collectors.groupingBy(Student::getStudengNo,
Collectors.summingDouble(item -> item.getScore().doubleValue()))));
// 获取集合中对象属性的最大值
Student maxAge = stuData.stream().max(Comparator.comparing(Student::getAge)).get();
七、字符集合
# 集合转 ,分割的字符串
List<String> list = new ArrayList<>(list);
String str = String.join(",", list);
# 字符串转集合
String s = "张三,李四,王五";
List<String> newlist = new ArrayList<String>(Arrays.asList(s.split(",")));
八、stream 集合中bigdecimal类型相加
方法中不能调用清除缓存注解的方法,没有效果
BigDecimal totalCount = products.stream().map(product::getCount).reduce(BigDecimal.ZERO,BigDecimal::add);
九、两个不同类型的集合,通过对象的某个属性,找交集
1. 先将两个集合的属性分别取出来
2. 然后取交集,将集合取出来
public static void main(String[] args) {
// 测试数据
List<Order> orders = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
Order order = new Order();
order.setOrderId(Long.valueOf(i));
order.setProdName("测试" + Long.valueOf(i));
order.setOrderNumber("000"+String.valueOf(i));
orders.add(order);
}
for (int i = 11; i <= 13; i++) {
Order order = new Order();
order.setProdName("测试" + Long.valueOf(i));
order.setOrderId(Long.valueOf(i));
order.setOrderNumber("000"+String.valueOf(i));
orders.add(order);
}
List<Order> orders2 = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Order order = new Order();
order.setOrderNumber("000"+String.valueOf(i));
order.setOrderId(Long.valueOf(i));
order.setProdName("测试" + Long.valueOf(i));
orders2.add(order);
}
// 方法一:遍历,取相同的数据
long startTime = System.currentTimeMillis();
List<Order> sames = new ArrayList<>();
for (Order order : orders2) {
Order order1 = orders.stream().filter(item -> Objects.equals(item.getOrderNumber(), order.getOrderNumber())).findAny().orElse(null);
sames.add(order1);
}
long endTime = System.currentTimeMillis();
System.out.println("sames 所需时间:" + new BigDecimal(endTime).subtract(new BigDecimal(startTime)).longValue());
for (Order item : sames) {
if (Objects.isNull(item)){
continue;
}
System.out.println("sames: " + item.getOrderId() +" "+item.getOrderNumber() + " " + item.getProdName());
}
// 方法二:先将相同的属性找出来,再取相同的集合
long startTime2 = System.currentTimeMillis();
List<String> orderNums1 = orders.stream().map(Order::getOrderNumber).collect(Collectors.toList());
List<String> orderNums2 = orders2.stream().map(Order::getOrderNumber).collect(Collectors.toList());
// 取交集,集合为空情况请自行处理
orderNums2.retainAll(orderNums1);
List<Order> sames2 = new ArrayList<>();
for (String s : orderNums2) {
if (orderNums1.size()>=orderNums2.size()){
Order order = orders2.stream().filter(item -> Objects.equals(s, item.getOrderNumber())).findAny().orElse(null);
sames2.add(order);
} else {
Order order = orders.stream().filter(item -> Objects.equals(s, item.getOrderNumber())).findAny().orElse(null);
sames2.add(order);
}
}
long endTime2 = System.currentTimeMillis();
System.out.println("sames2 所需时间:" + new BigDecimal(endTime2).subtract(new BigDecimal(startTime2)).longValue());
for (Order item : sames2) {
if (Objects.isNull(item)){
continue;
}
System.out.println("sames2: " + item.getOrderId() +" "+item.getOrderNumber() + " " + item.getProdName());
}
}
// 结果:
sames 所需时间:86
sames: 1 0001 测试1
sames: 2 0002 测试2
sames: 3 0003 测试3
sames: 4 0004 测试4
sames: 5 0005 测试5
sames2 所需时间:8
sames2: 1 0001 测试1
sames2: 2 0002 测试2
sames2: 3 0003 测试3
sames2: 4 0004 测试4
sames2: 5 0005 测试5
本文详细介绍Java中List集合的分页、合并、去重等实用操作,包括如何找出两个List集合的相同与不同部分,以及利用Stream API高效处理集合数据。
3509

被折叠的 条评论
为什么被折叠?



