使用Java 8比较器对实体内的列表进行排序

时间:2018-09-04 18:24:13

标签: java list sorting

我想使用Java 8比较器对实体内的列表进行排序。
有人可以帮我在这里替换它-> thenComparing(???)



@Test
public void testSort() {
    // given
    List<Person> values = Lists.newArrayList(
            new Person("you", Lists.newArrayList(new Todo("A"))),
            new Person("me", Lists.newArrayList(new Todo("B"), new Todo("A"), new Todo("C"))),
            new Person("me", Lists.newArrayList(new Todo("A"))),
            new Person("me", Lists.newArrayList(new Todo("D")))
    );

    // when
    List<Person> result = values
            .stream()
            .sorted(Comparator
                    .comparing(Person::getName))
                    .thenComparing(???) <-- TODO
            .collect(Collectors.toList());

    // then
    assertEquals(4, result.size());

    Person person_1 = result.get(0);
    assertEquals("me", person_1.getName());
    assertEquals(1, person_1.getTodos().size());
    assertEquals("A", person_1.getTodos().get(0).getName());

    Person person_2 = result.get(1);
    assertEquals("me", person_2.getName());
    assertEquals(3, person_2.getTodos().size());
    assertEquals("A", person_2.getTodos().get(0).getName());
    assertEquals("B", person_2.getTodos().get(1).getName());
    assertEquals("C", person_2.getTodos().get(2).getName());

    Person person_3 = result.get(2);
    assertEquals("me", person_3.getName());
    assertEquals(1, person_3.getTodos().size());
    assertEquals("D", person_3.getTodos().get(0).getName());

    Person person_4 = result.get(3);
    assertEquals("you", person_4.getName());
    assertEquals(1, person_4.getTodos().size());
    assertEquals("A", person_4.getTodos().get(0).getName());

}

@Data
@AllArgsConstructor
class Todo {

    private String name;
}

@Data
@AllArgsConstructor
class Person {

    private String name;
    private List<Todo> todos;
}

预期的排序结果:
人员(名称=我,todos = [Todo(名称= A)])
人(name = me,todos = [Todo(name = A),Todo(name = B),Todo(name = C)])
人员(名称=我,todos = [Todo(名称= D)])
人(name = you,todos = [Todo(name = A)])

1 个答案:

答案 0 :(得分:0)

通过编辑类https://graph.microsoft.com/v1.0/users/test@test.onmicrosoft.com/?$select=onPremisesDomainName,onPremisesDistinguishedName Person,并结合Java中内置Todo排序的事实,这变得更加容易。

因此,首先考虑一下,我们可以在第一个String之后使用thenComparing,方法是将待办事项列表转换为字符串,然后按该字符串排序。我们首先通过添加返回字符串形式的comparing列表的函数来编辑Person类。最终看起来像这样:

Todo

我们还希望更改public class Person { private String name; private List<Todo> todos; public Person(String name, List<Todo> todos) { this.name = name; this.todos = todos; } public String getName() { return name; } public List<Todo> getTodos() { return todos; } public String getTodoListAsString() { return this.todos.stream() .map(Todo::getName) .sorted() .collect(Collectors.joining()); } } 类以实现Comparable,以便我们可以将其中的Todo列表映射到排序列表中。我们可以这样编辑Todo类来完成此操作:

Todo

现在我们可以在流中使用它了,

public class Todo implements Comparable<Todo> {
    private String name;

    public Todo(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Todo o) {
        return this.getName().compareTo(o.getName());
    }
}