JDK8 List<T>按照某字段分组、按照某字段排序、多字段排序

JDK8 List<T>按照某字段分组、按照某字段排序、多字段排序

一、JDK8 List按照某字段分组

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TestSort {
    public static void main(String[] args) {

        List<Ticket> list = new ArrayList<Ticket>();
        Ticket data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("1b82899c065d4474b85cfb809a99396a");
        data.setTicketName("金卡");
        data.setBatchId("7ed298bd08104cfe9ece16621c5e51ce");
        data.setConvertible("0");
        data.setGradeLimit("金卡");
        data.setBatchAvailableNum("100");
        data.setSaleNum("10");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("1");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("30");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("3");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("6");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("11");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("96c166ce59894cf0a4f8fc14a5c94fb2");
        data.setTicketName("普卡");
        data.setBatchId("1c332332b0d64d729a3521ea253fe621");
        data.setConvertible("1");
        data.setGradeLimit("普卡");
        data.setBatchAvailableNum("90");
        data.setSaleNum("33");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("b3826676e6e14168b58a1342b049723c");
        data.setTicketName("银卡");
        data.setBatchId("6d32889f9ab7450fb48fedad5efcaf85");
        data.setConvertible("0");
        data.setGradeLimit("银卡");
        data.setBatchAvailableNum("30");
        data.setSaleNum("33");
        list.add(data);
        //根据ticketId字段进行分组
        Map<String, List<Ticket>> map = list.stream().collect(Collectors.groupingBy(Ticket::getTicketId));
        List<Ticket> newList = new ArrayList<Ticket>();
        //取每组的第一条数据
        map.forEach((s, tickets) -> {
            newList.add(tickets.get(0));
        });

        for(Ticket ticket:newList){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
    }
}

运行结果:
在这里插入图片描述

二、JDK8 List按照某字段排序,单字段排序

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TestSort {
    public static void main(String[] args) {

        List<Ticket> list = new ArrayList<Ticket>();
        Ticket data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("1b82899c065d4474b85cfb809a99396a");
        data.setTicketName("金卡");
        data.setBatchId("7ed298bd08104cfe9ece16621c5e51ce");
        data.setConvertible("0");
        data.setGradeLimit("金卡");
        data.setBatchAvailableNum("100");
        data.setSaleNum("10");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("1");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("30");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("3");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("6");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("11");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("96c166ce59894cf0a4f8fc14a5c94fb2");
        data.setTicketName("普卡");
        data.setBatchId("1c332332b0d64d729a3521ea253fe621");
        data.setConvertible("1");
        data.setGradeLimit("普卡");
        data.setBatchAvailableNum("90");
        data.setSaleNum("33");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("b3826676e6e14168b58a1342b049723c");
        data.setTicketName("银卡");
        data.setBatchId("6d32889f9ab7450fb48fedad5efcaf85");
        data.setConvertible("0");
        data.setGradeLimit("银卡");
        data.setBatchAvailableNum("30");
        data.setSaleNum("33");
        list.add(data);
        //根据ticketId字段进行分组
        Map<String, List<Ticket>> map = list.stream().collect(Collectors.groupingBy(Ticket::getTicketId));
        List<Ticket> newList = new ArrayList<Ticket>();
        //取每组的第一条数据
        map.forEach((s, tickets) -> {
            newList.add(tickets.get(0));
        });

        for(Ticket ticket:newList){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
        System.out.println("--------------------------------------list------------------------------------");
        // 根据BatchAvailableNum降序
        newList.sort(Comparator.comparing(Ticket::getSaleNum).reversed());
        //SaleNum降序
        newList.sort(Comparator.comparing(Ticket::getBatchAvailableNum).reversed());

        for(Ticket ticket:newList){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
    }
}


运行结果:
在这里插入图片描述

三、JDK8 List按照多字段排序(两个)

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {

        List<Ticket> list = new ArrayList<Ticket>();
        Ticket data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("1b82899c065d4474b85cfb809a99396a");
        data.setTicketName("金卡");
        data.setBatchId("7ed298bd08104cfe9ece16621c5e51ce");
        data.setConvertible("0");
        data.setGradeLimit("金卡");
        data.setBatchAvailableNum("100");
        data.setSaleNum("10");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("1");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("30");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("3");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("6");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("5ecd6634026c45edaca8b4ebfdf3964c");
        data.setTicketName("电子券001");
        data.setBatchId("2d29984f938b446b9174a24233b64b39");
        data.setConvertible("0");
        data.setGradeLimit("都可");
        data.setBatchAvailableNum("100");
        data.setSaleNum("11");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("96c166ce59894cf0a4f8fc14a5c94fb2");
        data.setTicketName("普卡");
        data.setBatchId("1c332332b0d64d729a3521ea253fe621");
        data.setConvertible("1");
        data.setGradeLimit("普卡");
        data.setBatchAvailableNum("90");
        data.setSaleNum("33");
        list.add(data);

        data = new Ticket();
        data.setGroupId("8a8480487c96d58f017c9b7bab7d0020");
        data.setMallid("8a8481f57cca9442017ce026ddd40049");
        data.setTicketId("b3826676e6e14168b58a1342b049723c");
        data.setTicketName("银卡");
        data.setBatchId("6d32889f9ab7450fb48fedad5efcaf85");
        data.setConvertible("0");
        data.setGradeLimit("银卡");
        data.setBatchAvailableNum("30");
        data.setSaleNum("33");
        list.add(data);
        //根据ticketId字段进行分组
        Map<String, List<Ticket>> map = list.stream().collect(Collectors.groupingBy(Ticket::getTicketId));
        List<Ticket> newList = new ArrayList<Ticket>();
        //取每组的第一条数据
        map.forEach((s, tickets) -> {
            newList.add(tickets.get(0));
        });

        for(Ticket ticket:newList){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
        System.out.println("--------------------------------------list------------------------------------");

        //方式一:多个字段排序(两个)
        //先以属性BatchAvailableNum降序,再进行属性SaleNum降序 多个字段 后面追加即可
        List<Ticket> sortList =  newList.stream()
                .sorted(Comparator.comparing(Ticket::getSaleNum).reversed())
                .sorted(Comparator.comparing(Ticket::getBatchAvailableNum).reversed())
                .collect(Collectors.toList());
       //方式二:多个字段排序(两个)  
      //Collections.sort(list, Comparator.comparing(Ticket::getSaleNum)
		//				.thenComparing(Ticket::getBatchAvailableNum).reversed());

        for(Ticket ticket:sortList){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
    }
}

运行结果:
在这里插入图片描述

四、JDK8 List按照多字段排序(大于两个)

package com.example.listdemo.utils;

import com.example.listdemo.entity.Ticket;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * List集合排序:单字段排序
 * @author qzz
 */
public class ListSortMultiple {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        List<Ticket> list = new ArrayList<Ticket>();
        Ticket data = new Ticket();
        data.setTicketName("测试券1");
        data.setConvertible("0");
        data.setCreateDate(sdf.parse("2022-01-05 22:56:03"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("1");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("11");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券2");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 22:54:11"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("1");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("31");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券3");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 22:52:06"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("1");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("41");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券4");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-07 17:03:42"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("10");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("12");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券5");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 14:10:09"));
        data.setExEndTime(sdf.parse("2022-01-15 23:59:59"));
        data.setExIntegral("0");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("11");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券6");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 09:48:43"));
        data.setExEndTime(sdf.parse("2022-01-12 23:59:59"));
        data.setExIntegral("0");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("8");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券7");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 22:58:27"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("1200");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("16");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券8");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-10 17:56:44"));
        data.setExEndTime(sdf.parse("2022-01-31 23:59:59"));
        data.setExIntegral("1000");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("21");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试券9");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-05 21:54:37"));
        data.setExEndTime(sdf.parse("2022-01-12 23:59:59"));
        data.setExIntegral("9");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("2");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试1券");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2022-01-11 11:27:11"));
        data.setExEndTime(sdf.parse("2022-01-12 23:59:59"));
        data.setExIntegral("1000");
        data.setExMoney("0.01");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("1");
        list.add(data);

        data = new Ticket();
        data.setTicketName("测试2券");
        data.setConvertible("1");
        data.setCreateDate(sdf.parse("2021-12-23 14:35:57"));
        data.setExEndTime(sdf.parse("2022-01-13 23:59:59"));
        data.setExIntegral("50");
        data.setExMoney("0");
        data.setIsSoldOut("1");
        data.setIsSpike("0");
        data.setSaleNum("2");
        list.add(data);

        for(Ticket ticket:list){
            System.out.println(ticket.getTicketName()+","+ticket.getConvertible()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
        System.out.println("--------------------------------------list------------------------------------");

        //jdk8 组合降序排序
        //isSoldOut desc,convertible desc,isSpike desc,saleNum desc,exIntegral desc,exMoney desc,exEndTime asc,createDate desc
        //Comparator.reverseOrder():降序 Comparator.naturalOrder():升序

        //方式一:多个字段排序(多余两个)
        //先以属性SaleNum降序,再进行属性BatchAvailableNum升序 多个字段 后面追加即可
//        List<Ticket> sortList =  list.stream()
//                .sorted(Comparator.comparing(Ticket::getSaleNum,Comparator.reverseOrder())
//                        .thenComparing(e->{
//                            return Integer.valueOf(e.getBatchAvailableNum());
//                        },Comparator.naturalOrder())
//                        .thenComparing(e->{
//                            return Integer.valueOf(e.getConvertible());
//                        },Comparator.reverseOrder())
//                )
//                .collect(Collectors.toList());
        
        //方式二:多个字段排序(多余两个)
        Collections.sort(list, Comparator.comparing(Ticket::getIsSoldOut,Comparator.reverseOrder())
                .thenComparing(Ticket::getConvertible,Comparator.reverseOrder())
                .thenComparing(Ticket::getIsSpike,Comparator.reverseOrder())
                .thenComparing(t->Integer.parseInt(t.getSaleNum()),Comparator.reverseOrder())
                .thenComparing(t->Double.valueOf(t.getExIntegral()),Comparator.reverseOrder())
                .thenComparing(t->Double.valueOf(t.getExMoney()),Comparator.reverseOrder())
                .thenComparing(Ticket::getExEndTime,Comparator.naturalOrder())
                .thenComparing(Ticket::getCreateDate,Comparator.reverseOrder())
        );

        //输出
        Ticket.printTickets(list);
    }
}



Ticket对象:

package com.example.listdemo.entity;

import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 电子券信息
 * @author qzz
 */
@Data
public class Ticket {

    private String groupId;
    private String mallid;
    private String ticketId;
    private String ticketName;
    private String batchId;
    private String convertible;
    private String gradeLimit;
    private String batchAvailableNum;
    private String saleNum;
    private String exIntegral;
    private String exMoney;
    private String isSoldOut;
    private String isSpike;
    private Date exEndTime;
    private Date createDate;

    /**
     * 输出打印信息
     * @param list
     */
    public static void printTickets(List<Ticket> list){
        System.out.println("[电子券名称]\t\t[isSoldOut]\t\t[convertible]\t\t[isSpike]\t\t[saleNum]\t\t[exIntegral]\t\t[exMoney]\t\t[exEndTime]\t\t[createDate]");
        System.out.println("-----------------------------------------------------------------------");
        list.forEach(u-> System.out.println(printValue(u)));
        System.out.println(" ");
    }

    /***
     * 输出list结果集
     * @param ticket
     * @return
     */
    public static String printValue(Ticket ticket){
        String str=String.format("%s\t\t\t\t%s\t\t\t\t%s\t\t\t\t\t%s\t\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s",
                ticket.ticketName,ticket.isSoldOut,ticket.convertible.toString(),ticket.isSpike.toString(),ticket.saleNum.toString(),
                ticket.exIntegral.toString(),ticket.exMoney.toString(),ticket.exEndTime.toString(),ticket.createDate.toString());
        return str;
    }
}

运行结果:

在这里插入图片描述


版权声明:本文为qq_26383975原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。