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