Java collections are sorted by multiple fields

Take the Apple entity as an example, first sort by name in ascending order, and then sort by size in descending order

Test code

Apple class

package com.me.entity;

import lombok.Builder;
import lombok.Data;

/**
 * @author yanyg
 * @since 2020/8/5
 */
@Data
@Builder
public class Apple {
    
    
    private String color;
    private String name;
    private Integer size;

}

AppleComparatorTest class

package cn.me.mybatis;

import cn.yto.utils.JsonUtil;
import com.me.entity.Apple;
import org.assertj.core.util.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Comparator;
import java.util.List;

/**
 * @author yanyg
 * @since 2020/8/5
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class AppleComparatorTest {
    
    

    @Test
    public void comparatorApples() {
    
    
        List<Apple> apples = buildApples();

        Comparator<Apple> byName = Comparator.comparing(Apple::getName);
        Comparator<Apple> bySizeDesc = Comparator.comparing(Apple::getSize).reversed();
        /**
         * 先按 name 升序排序,再按 size 降序排序, 但是 name 和 size 都不能为 null
         */
        apples.sort(byName.thenComparing(bySizeDesc));
        apples.stream().forEach(t -> System.out.println(JsonUtil.toJson(t)));
    }

    @Test
    public void comparatorApplesTwo() {
    
    
        List<Apple> apples = buildApples();
        // name 为 null 时,排在最后面
        Comparator<Apple> byName = 
        	Comparator.comparing(apple -> apple.getName(), Comparator.nullsLast(String::compareTo));
        // size 为 null 时,排在最后面
        Comparator<Apple> bySizeDesc = 
        	Comparator.comparing(apple -> apple.getSize(),Comparator.nullsFirst(Integer::compareTo).reversed());

        /**
         * 先按 name 升序排序,再按 size 降序排序, name 和 size 可为 null
         */
        apples.sort(byName.thenComparing(bySizeDesc));
        // since 1.8
        //apples = apples.stream().sorted(byName.thenComparing(bySizeDesc)).collect(Collectors.toList());
        apples.stream().forEach(t -> System.out.println(JsonUtil.toJson(t)));
    }


    public List<Apple> buildApples() {
    
    
        List<Apple> apples = Lists.newArrayList();
        apples.add(Apple.builder().name("red apple").size(180).build());
        apples.add(Apple.builder().name("red apple").size(150).build());
        // size 为 null
        apples.add(Apple.builder().name("red apple").build());
        apples.add(Apple.builder().name("big apple").size(260).build());
        apples.add(Apple.builder().name("small apple").size(150).build());
        apples.add(Apple.builder().name("big apple").size(300).build());
        apples.add(Apple.builder().name("green apple").size(310).build());
        // name 为 null
        apples.add(Apple.builder().size(260).build());
        return apples;
    }

}

Reference documents

Guess you like

Origin blog.csdn.net/thebigdipperbdx/article/details/107843684