簡體   English   中英

Java 8 List.sort用法

[英]Java 8 List.sort usage

Java 8中的List類添加了一個新的方法sort 任何人都可以澄清我應該何時更喜歡使用它而不是Collections.sort(..)方法?

沒有功能差異,因為Collections.sort(list)調用list.sort(null)Collections.sort(list, comparator)調用list.sort(comparator)

所以這只是一種風格問題 - 當提供自己的比較器時,在列表上調用sort可能比使用外部靜態方法更自然和可讀。

但是,如果您只想按自然順序對列表進行排序,則Collections.sort(list)可能比list.sort(null)更清晰。

你應該去List.sort

使用List.sort示例,根據元素的長度對String列表進行排序:

List<String> list = new ArrayList<>(Arrays.asList("aa", "aaa", "a"));
list.sort(comparing(String::length));

Collections.sort()是Java 8之前的做法。 請注意,兩者之間沒有真正的區別。 如果您查看Collections.sort源代碼,您會注意到它調用list.sort

public static <T extends Comparable<? super T>> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

雖然您可以使用List.sort(Comparator)方法,但此方法的主要目的是重寫。 在Java-8之前,每個List的排序都有些無效。 首先通過toArray()方法將列表轉儲到數組中,然后對數組進行排序,最后通過ListIterator.set更新列表。 在Java-8中,這是List.sort(Comparator)默認方法中實現的默認行為。 但是,如果可以提供更有效的算法,則可以在子類中更改它。 例子:

  • ArrayListArrays.asList()提供自己的sort實現,直接對內部數組進行排序,因此您無需來回復制。

  • CopyOnWriteArrayList現在就可以排序了! 請嘗試以下代碼:

     List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("a", "c", "b")); Collections.sort(list); 

    在Java-7中,它拋出UnsupportedOperationException ,因為支持ListIterator.set與此列表的思想相矛盾(每個迭代器都迭代獨立快照)。 在Java-8中, ListIterator.set仍然不受支持,但由於自定義排序實現,此代碼可以正常工作。

  • Collections.singletonListCollections.emptyList什么都不做(排序0或1元素是無操作),這肯定比創建單元素或零元素數組更快,對其進行排序並迭代列表以設置值。

  • Collections.unmodifiableList現在只拋出UnsupportedOperationException 在Java-8之前,只有在將不可變列表轉儲到數組之后才會獲得異常,對數組進行排序並開始將其寫回。


這是一個可能在用戶代碼中有用的示例。 假設您要創建某個列表的映射視圖:

public class MappedList<T, R> extends AbstractList<R> {
    private final List<T> source;
    private final Function<? super T, ? extends R> mapper;

    public MappedList(List<T> source, Function<? super T, ? extends R> mapper) {
        this.source = source;
        this.mapper = mapper;
    }

    @Override
    public R get(int index) {
        return mapper.apply(source.get(index));
    }

    @Override
    public int size() {
        return source.size();
    }
}

用法示例:

List<String> list = Arrays.asList("a", "foo", "bb", "bar", "qq");
List<Integer> mappedList = new MappedList<>(list, String::length);
System.out.println(mappedList); // prints [1, 3, 2, 3, 2]

工作正常,但嘗試Collections.sort(mappedList); 你將得到UnsupportedOperationExceptionset操作不起作用,因為你無法反轉映射功能)。 但是,如果在MappedList實現sort()方法,則可以對其進行正確排序(更改原始列表):

@Override
public void sort(Comparator<? super R> c) {
    @SuppressWarnings("unchecked")
    Comparator<? super T> comparator = c == null ? 
        Comparator.comparing((Function<? super T, ? extends Comparable<Object>>) mapper) : 
        Comparator.comparing(mapper, c);
    source.sort(comparator);
}

List<String> list = Arrays.asList("a", "foo", "bb", "bar", "qq");
List<Integer> mappedList = new MappedList<>(list, String::length);
Collections.sort(mappedList);
System.out.println(mappedList); // prints [1, 2, 2, 3, 3]
System.out.println(list); // prints [a, bb, qq, foo, bar]

在提供自己的比較器時應該使用它。 例如:

list.sort(Comparator.reverseOrder());

代替:

Collections.sort(list);
Collections.reverse(list);

列表類作為JSR 335更改的一部分,我們可以使用該方法對列表進行排序:

//在List中使用sort方法。

personList.sort((p1,p2) - > p1.firstName.compareTo(p2.firstName));

- 在java 8之前我們只能使用這個tye --- Collections.sort(personList,(p1,p2) - > p1.firstName.compareTo(p2.firstName));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM