DrA*_*zek 2 java sorting lambda arraylist java-stream
我的目标是打印出四个中的两个值 - 名称(字符串)和头发颜色(枚举) - 描述arraylist中的某个对象.问题在于按名称按字母顺序对打印列表进行排序.这一切都必须在一个lambda.
我只是打印出来而没有排序.我已经设置了覆盖但是因为我还在学习,我似乎无法让它工作.
public void printAllNamesColours() {
people.stream()
.forEach(n->System.out.println(n.getName() + " " + n.getColour()));
}
@Override
public int compareTo(Person person) {
int ret = name.compareToIgnoreCase(person.name);
if (ret == 0) {
ret = colour.compareTo(person.colour);
}
if (ret == 0) {
ret = age - person.age;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Stream.sorted
as 进行排序:
people.stream()
.sorted() // considering your `compareTo` implementation
.forEach(n -> System.out.println(n.getName() + " " + n.getColour()));
Run Code Online (Sandbox Code Playgroud)
作为您的Person
对象Comparable
,您可以直接调用该sorted
方法并打印结果.
people.stream()
.sorted()
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
Run Code Online (Sandbox Code Playgroud)
请注意,我使用forEachOrdered
了相反,forEach
以保证元素按排序顺序打印.
您可能还决定仅对我的名称进行排序或仅按颜色排序而不更改当前的compareTo
实现,在这种情况下,您可以使用自定义比较器:
people.stream()
.sorted(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER))
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
Run Code Online (Sandbox Code Playgroud)
并按颜色:
people.stream()
.sorted(Comparator.comparing(Person::getColour, String.CASE_INSENSITIVE_ORDER))
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
Run Code Online (Sandbox Code Playgroud)