java8(3) sorted的使用

内容来自

看个源码

package java.util;

import java.io.Serializable;
import java.util.function.Function;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
import java.util.function.ToDoubleFunction;
import java.util.Comparators;


@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }
    default Comparator<T> thenComparing(Comparator<? super T> other) {
        Objects.requireNonNull(other);
        return (Comparator<T> & Serializable) (c1, c2) -> {int res = compare(c1, c2);
        return (res != 0) ? res : other.compare(c1, c2);
        };
    }
    
    default <U> Comparator<T> thenComparing(
            Function<? super T, ? extends U> keyExtractor,
            Comparator<? super U> keyComparator){
        return thenComparing(comparing(keyExtractor, keyComparator));
    }

    
    default <U extends Comparable<? super U>> Comparator<T> thenComparing(
            Function<? super T, ? extends U> keyExtractor) {
        return thenComparing(comparing(keyExtractor));
    }

 
    default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {
        return thenComparing(comparingInt(keyExtractor));
    }

    default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) {
        return thenComparing(comparingLong(keyExtractor));
    }

    default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) {
        return thenComparing(comparingDouble(keyExtractor));
    }

 
    public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
        return Collections.reverseOrder();
    }


    @SuppressWarnings("unchecked")
    public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
        return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
    }


    public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
        return new Comparators.NullComparator<>(true, comparator);
    }


    public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
        return new Comparators.NullComparator<>(false, comparator);
    }

    public static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator){
        Objects.requireNonNull(keyExtractor);
        Objects.requireNonNull(keyComparator);
        return (Comparator<T> & Serializable)(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2));
    }

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor){
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }

    public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1)keyExtractor.applyAsInt(c2));
    }
    public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)(c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2));
    }
    public static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)(c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2));
    }
}

排序List

package lambda.bean;

/**
 * @author wangkaijie
 */
public class Student implements Comparable<Student> {
    private int id;
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public int getId() {
        return id;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student ob) {
        return name.compareTo(ob.getName());
    }
    @Override
    public boolean equals(final Object obj) {
        if (obj == null) {
            return false;
        }
        final Student std = (Student) obj;
        if (this == std) {
            return true;
        } else {
            return (this.name.equals(std.name) && (this.age == std.age));
        }
    }
    @Override
    public int hashCode() {
        int hashno = 7;
        hashno = 13 * hashno + (name == null ? 0 : name.hashCode());
        return hashno;
    }
}
package lambda.bean;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import  static java.util.stream.Collectors.toList;
/**
 * @author wangkaijie
 * @date 2018/1/28
 */
public class SortList {
    public static void main(String arg[]) {
        List<Student> list = new ArrayList<Student>();
        list.add(new Student(1, "Mahesh", 12));
        list.add(new Student(2, "Suresh", 15));
        list.add(new Student(3, "Nilesh", 10));

        System.out.println("---以名字的自然顺序排序---");
        List<Student> slist = list.stream().sorted().collect(toList());
        slist.forEach(e -> System.out.println("Id:" + e.getId() + ", Name: " + e.getName() + ", Age:" + e.getAge()));

        System.out.println("---以名字的自然顺序的反序排序---");
        slist = list.stream().sorted(Comparator.reverseOrder()).collect(toList());
        slist.forEach(e -> System.out.println("Id:" + e.getId() + ", Name: " + e.getName() + ", Age:" + e.getAge()));

        System.out.println("---通过age排序---");
        slist = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:" + e.getId() + ", Name: " + e.getName() + ", Age:" + e.getAge()));

        System.out.println("---通过age的逆序---");
        slist = list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:" + e.getId() + ", Name: " + e.getName() + ", Age:" + e.getAge()));
    }
}

Stream类型的sorted方法有两个版本:

//按照目标对象的自然排序(Natural Order)方式进行排序,且目标对象类型必须实现Comparable接口
Stream<T> sorted();
//传入一个函数式接口
Stream<T> sorted(Comparator<? super T> comparator);

sorted方法返回的仍然是一个Stream对象。

转载于:https://my.oschina.net/u/563488/blog/1614207

### 对 Java 8 Stream 中的数据进行降序排序 Java 8 的 Stream API 提供了简洁且灵活的方式来处理集合数据,包括对数据进行排序。通过 `sorted()` 方法结合 `Comparator`,可以轻松实现降序排序[^2]。 #### 基本数据类型列表的降序排序 对于整数或字符串等基本数据类型列表,可以直使用 `Comparator.reverseOrder()` 进行降序排序。例如: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class DescendingSortExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(5, 2, 9, 1, 7); List<Integer> sortedNumbers = numbers.stream() .sorted(Comparator.reverseOrder()) .collect(Collectors.toList()); System.out.println(sortedNumbers); // 输出 [9, 7, 5, 2, 1] } } ``` 该方式适用于整数、字符串等可比较类型,利用 `Comparator.reverseOrder()` 实现自然顺序的倒序排列[^3]。 #### 字符串列表排序并转换为大写 在对字符串列表进行排序的同时,还可以通过 `map()` 方法将其转换为大写形式。例如: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class SortAndUppercase { public static void main(String[] args) { List<String> strings = Arrays.asList("java", "stream", "api", "programming", "language"); List<String> sortedAndUppercase = strings.stream() .sorted() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(sortedAndUppercase); // 输出 [API, JAVA, LANGUAGE, PROGRAMMING, STREAM] } } ``` 此方法首先按自然顺序排序,然后通过 `map()` 将每个字符串转换为大写形式,最终收集为一个新的列表[^1]。 #### 自定义对象按字段降序排序 对于自定义对象,可以通过 `Comparator.comparing()` 指定排序字段,并结合 `reversed()` 方法实现降序排列。例如,对 `User` 对象按创建时间进行降序排序: ```java import java.time.LocalDateTime; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; class User { private String name; private LocalDateTime createTime; public User(String name, LocalDateTime createTime) { this.name = name; this.createTime = createTime; } public String getName() { return name; } public LocalDateTime getCreateTime() { return createTime; } @Override public String toString() { return "User{name=&#39;" + name + "&#39;, createTime=" + createTime + "}"; } } public class UserSortExample { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", LocalDateTime.of(2023, 10, 1, 12, 0)), new User("Bob", LocalDateTime.of(2023, 9, 15, 14, 30)), new User("Charlie", LocalDateTime.of(2023, 11, 5, 9, 45)) ); List<User> sortedUsers = users.stream() .sorted(Comparator.comparing(User::getCreateTime).reversed()) .collect(Collectors.toList()); System.out.println(sortedUsers); } } ``` 该方式允许根据对象的任意字段进行排序,并支持降序排列[^5]。 #### 使用 Stream API 对 Map 进行降序排序 对 `Map` 的键值对进行排序时,可以通过 `entrySet().stream()` 获取流,并使用 `Map.Entry.comparingByValue()` 或 `comparingByKey()` 方法进行排序。例如,根据值进行降序排序: ```java import java.util.*; import java.util.stream.Collectors; public class MapSortExample { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("A", 3); map.put("B", 1); map.put("C", 2); Map<String, Integer> sortedMap = map.entrySet().stream() .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new )); System.out.println(sortedMap); // 输出 {A=3, C=2, B=1} } } ``` 此方法适用于需要对 `Map` 的键值对进行排序的场景,并支持降序排列[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值