天天看點

Java 集合按照多字段排序

以 Apple 實體為例,先按 name 升序排序,再按 size 降序排序

測試代碼

Apple 類

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 類

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;
    }

}

           

參考文檔

  • java list 按照多字段排序