请问谁能给我展示一个在Java 8中使用新的lambda语法如何对ArrayList
进行字母排序的快速示例。
请问谁能给我展示一个在Java 8中使用新的lambda语法如何对ArrayList
进行字母排序的快速示例。
对于字符串,这将起作用。
arrayList.sort((p1, p2) -> p1.compareTo(p2));
.sort(String::compareTo)
和.sort(Comparator.naturalOrder())
都会在任何小写字母之前对所有大写字母进行排序。通常你需要的是.sort(String::compareToIgnoreCase)
。 - UTF_or_Death你只是在对String
进行排序吗?如果是这样,你不需要使用lambda表达式;这没有意义。你只需执行以下操作:
import static java.util.Comparator.*;
list.sort(naturalOrder());
...虽然如果你正在按照String
字段对对象进行排序,那么它会更加有意义:
list.sort(comparing(Foo::getString));
使用 list.sort(String::compareToIgnoreCase)
方法进行排序。
使用 list.sort(String::compareTo)
或 list.sort(Comparator.naturalOrder())
将会导致错误的(即非字母顺序)排序结果。这会将任何大写字母排在所有小写字母前面,因此数组["aAAA","Zzz", "zzz"]
会被排序为["Zzz", "aAAA", "zzz"]
List<String> result = names.stream().sorted(
Comparator.comparing(n->n.toString())).collect(Collectors.toList());
Comparator
是完全不必要的。 - Riverlist.stream().sorted().map(blah-blah).filter(...)...
list = list.stream().sort().collect(Collectors.toList());
,但是作者要求使用Java 8风格,而这就是Java 8风格。 - Dmitry GinzburgString
进行排序,这是默认行为。 - Dmitry Ginzburg不应该把Lambda作为目标。在您的情况下,可以按照Java 1.2中的方式进行排序:
Collections.sort(list); // case sensitive
Collections.sort(list, String.CASE_INSENSITIVE_ORDER); // case insensitive
list.sort(Comparator.naturalOrder()); // case sensitive
list.sort(String.CASE_INSENSITIVE_ORDER); // case insensitive
您也可以使用 list.sort(null)
,但我不建议这样做,因为它不是类型安全的。
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));
最简练:
Collections.sort(stringList, String::compareToIgnoreCase);
如果您有一个具有自然排序的元素数组(即 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);
List<Product> list = new ArrayList<>();
List<String> list1 = new ArrayList<>();
list.add(new Product(1));
list.add(new Product(2));
list.add(new Product(3));
list.add(new Product(10));
Collections.sort(list, Comparator.comparing((Product p) -> p.id));
for (Product p : list) {
System.out.println(p.id);
}