我的目标是从四个值中打印出两个值-名称(字符串)和头发颜色(枚举)-这些值描述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;
}
答案 0 :(得分:5)
您可以使用Stream.sorted
对其进行排序:
people.stream()
.sorted() // considering your `compareTo` implementation
.forEach(n -> System.out.println(n.getName() + " " + n.getColour()));
答案 1 :(得分:5)
由于Person
对象是Comparable
,因此您可以直接调用sorted
方法并打印结果。
people.stream()
.sorted()
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
请注意,我使用forEachOrdered
而不是forEach
来确保元素按已排序的顺序打印。
您也可以决定不更改当前compareTo
的实现方式而仅对我的名字或仅按颜色进行排序,在这种情况下,您可以使用自定义比较器:
people.stream()
.sorted(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER))
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
和颜色:
people.stream()
.sorted(Comparator.comparing(Person::getColour, String.CASE_INSENSITIVE_ORDER))
.forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
答案 2 :(得分:1)
另一个答案告诉您,您需要在流中添加.sorted()
操作
除此之外,我想向您建议另一种比较Person
的方法:
static Comparator<Person> comparator =
Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER)
.thenComparing(Person::getColour)
.thenComparing(Person::getAge);
@Override
public int compareTo(Person person) {
return comparator.compare(this, person);
}
// with the different getters
答案 3 :(得分:1)
listPersonVO.stream()。sorted((o1,o2)-> o1.getName()。trim()。compareTo(o2.getName()。trim()))。collect(Collectors.toList()) ;