Java集合部分

本文详细介绍Java中List集合的分页、合并、去重等实用操作,包括如何找出两个List集合的相同与不同部分,以及利用Stream API高效处理集合数据。

一、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());
}

方法3public 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值