对一个arraylist对象的值进行排序,并在一个lambda中打印它们的多个

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)

Nam*_*man 5

您可以使用Stream.sortedas 进行排序:

people.stream()
      .sorted() // considering your `compareTo` implementation
      .forEach(n -> System.out.println(n.getName() + " " + n.getColour()));
Run Code Online (Sandbox Code Playgroud)


Ous*_* D. 5

作为您的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)