如何比较嵌套对象
How to compare nested objects
我正在尝试按用户名对 LeaveRequest 列表进行排序,但它不起作用。结果列表不是根据用户名排序的,它似乎不受 sorted() 方法的影响。
这是我使用的比较代码:
leaveRequests = leaveRequests.stream()
.sorted(Comparator.comparing(x -> x.getUser().getName()))
.collect(Collectors.toList());
这是请假请求class:
@Entity
@Table
public class LeaveRequest implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne(optional = false)
@NotNull
@JoinColumn(name = "user_id")
private User user;
... getter and setter
}
和用户 class:
@Entity
@Table(name = "\"user\"")
public class User implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
@NotNull
@Size(min = 1, max = 100)
private String name;
... getter and setter
}
字符串比较是根据字典顺序 (ascii/unicode) 执行的,这与字母顺序(又名字典顺序)不同,如果不进行一些调整,可能无法很好地本地化。
例如,如果您 运行 遇到小写和大写字母排序不正确的问题(例如,您想要 dginzberg - Fyruz - Mark Rotteveel - rzwitserloot - user16320675
的顺序,但您得到了 dginzberg - rzwitserloot - user16320675 - Fyruz - Mark Rotteveel
那是因为大写字母和小写字母在 ascii 和 unicode 系统中被视为不同的字符。
如果这是您 运行 遇到的问题,您可能需要考虑使用 to sort your stream. This would be a small change so your comparator line includes a function in your comparator, as documented in the Java API here。可能类似于下面的代码片段:
leaveRequests = leaveRequests.stream()
.sorted(Comparator.comparing(x -> x.getUser().getName(), String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList());
您可以让您的 LeaveRequest class 实现可比较和 compare.by 用户名。然后简单 list.stream.sorted 然后收集就足够了。
我正在尝试按用户名对 LeaveRequest 列表进行排序,但它不起作用。结果列表不是根据用户名排序的,它似乎不受 sorted() 方法的影响。
这是我使用的比较代码:
leaveRequests = leaveRequests.stream()
.sorted(Comparator.comparing(x -> x.getUser().getName()))
.collect(Collectors.toList());
这是请假请求class:
@Entity
@Table
public class LeaveRequest implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne(optional = false)
@NotNull
@JoinColumn(name = "user_id")
private User user;
... getter and setter
}
和用户 class:
@Entity
@Table(name = "\"user\"")
public class User implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
@NotNull
@Size(min = 1, max = 100)
private String name;
... getter and setter
}
字符串比较是根据字典顺序 (ascii/unicode) 执行的,这与字母顺序(又名字典顺序)不同,如果不进行一些调整,可能无法很好地本地化。
例如,如果您 运行 遇到小写和大写字母排序不正确的问题(例如,您想要 dginzberg - Fyruz - Mark Rotteveel - rzwitserloot - user16320675
的顺序,但您得到了 dginzberg - rzwitserloot - user16320675 - Fyruz - Mark Rotteveel
那是因为大写字母和小写字母在 ascii 和 unicode 系统中被视为不同的字符。
如果这是您 运行 遇到的问题,您可能需要考虑使用
leaveRequests = leaveRequests.stream()
.sorted(Comparator.comparing(x -> x.getUser().getName(), String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList());
您可以让您的 LeaveRequest class 实现可比较和 compare.by 用户名。然后简单 list.stream.sorted 然后收集就足够了。