我想使用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)])
答案 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());
}
}