Подтвердить что ты не робот

Сортировка ArrayList с Lambda в Java 8

Может ли кто-нибудь показать мне быстрый пример, как сортировать ArrayList в алфавитном порядке в Java 8 с использованием нового синтаксиса лямбда.

4b9b3361

Ответ 1

Для строк это будет работать

arrayList.sort((p1, p2) -> p1.compareTo(p2));

Ответ 2

Вы просто сортируете String s? Если это так, вам не нужны лямбды; нет смысла. Вы просто делаете

import static java.util.Comparator.*;

list.sort(naturalOrder());

... хотя, если вы сортируете объекты с полем String, то это имеет несколько больше смысла:

list.sort(comparing(Foo::getString));

Ответ 3

Используйте list.sort(String::compareToIgnoreCase)

Использование list.sort(String::compareTo) или list.sort(Comparator.naturalOrder()) приведет к неправильным (т.е. не-алфавитным) результатам. Он будет сортировать любое письмо верхнего регистра до всех строчных букв, поэтому массив ["aAAA","Zzz", "zzz"] сортируется по ["Zzz", "aAAA", "zzz"]

Ответ 4

Предположим, у вас есть список имен (String), которые вы хотите отсортировать в алфавитном порядке.

List<String> result = names.stream().sorted(
                 Comparator.comparing(n->n.toString())).collect(Collectors.toList());

работает отлично.

Ответ 5

Фактически общим решением было бы ввести некоторый StreamUtil как

public class StreamUtil {

    private StreamUtil() {
    }       

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static <TYPE> Comparator<TYPE> sort(Function<TYPE, ? extends Comparable> getterFunction, boolean descending) {
        if (descending) {
            return (o1, o2) -> getterFunction.apply(o2).compareTo(getterFunction.apply(o1));
        }
        return (o1, o2) -> getterFunction.apply(o1).compareTo(getterFunction.apply(o2));
    }

}

Вызов будет выглядеть примерно так:

list.stream().sorted(sort(YourClass::getSortProperty, true));

Ответ 6

В функциональном программировании вы не используете старые объекты для работы с ними, но создаете новый таким образом:

list.stream().sorted().map(blah-blah).filter(...)...

Ответ 7

Самый краткий:

Collections.sort(stringList, String::compareToIgnoreCase);

Ответ 8

Если у вас есть массив с элементами, которые имеют естественный порядок (т.е. String, int, double); тогда это может быть достигнуто путем:

List<String> myList = new ArrayList<>();
myList.add("A");
myList.add("D");
myList.add("C");
myList.add("B");
myList.sort(Comparator.comparing(s -> s));
myList.forEach(System.out::println);

Если с другой стороны у вас есть объект и вы хотите отсортировать базу по какому-либо полю объекта, то вы можете использовать:

class User {
    double score;
    // Constructor // Getters // Setters
}

List<User> users = new ArrayList<>();
users.add(new User(19d));
users.add(new User(67d));
users.add(new User(50d));
users.add(new User(91d));

List<User> sortedUsers = users
        .stream()
        .sorted(Comparator.comparing(User::getScore))
        .collect(Collectors.toList());

sortedUsers.forEach(System.out::println);

Если сортировка более сложная, вам придется написать собственный компаратор и передать его.