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

时间:2018-12-19 20:50:37

标签: java sorting arraylist lambda 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;
    }

4 个答案:

答案 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()) ;

enter image description here