Может ли кто-нибудь показать мне быстрый пример, как сортировать ArrayList
в алфавитном порядке в Java 8 с использованием нового синтаксиса лямбда.
Сортировка ArrayList с Lambda в Java 8
Ответ 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);
Если сортировка более сложная, вам придется написать собственный компаратор и передать его.