Java 带比较器的有序流
getSortedUsers是否总是独立于getUsers集合类型返回getUsers的orderd流Java 带比较器的有序流,java,java-8,java-stream,Java,Java 8,Java Stream,getSortedUsers是否总是独立于getUsers集合类型返回getUsers的orderd流 public Set<User> getUsers(){ // unordered collection type HashSet<User> set = new HashSet<>(); set.add(..); set.add(..); set.add(..); return set; } // Is t
public Set<User> getUsers(){
// unordered collection type
HashSet<User> set = new HashSet<>();
set.add(..);
set.add(..);
set.add(..);
return set;
}
// Is the stream only sorted if getUsers() is hold within a sortable collection type?
public Stream<User> getSortedUsers(Comparator<User> comp){
return getUsers().stream().sorted(comp);
}
getSortedUsers返回的流将始终被排序,这通过调用sortedcomp得到保证。流的源头是什么并不重要
现在,如果您决定将该流的元素收集到某个集合中,则顺序可能会保留,也可能不会保留,这取决于您选择的集合类型。如果将元素收集到哈希集中,则会丢失顺序。如果您收集到树集、LinkedHashSet或任何列表中,您将保留顺序。getSortedUsers返回的流将始终被排序,这通过调用sortedcomp得到保证。流的源头是什么并不重要
根据您现在选择的集合类型,您可以选择不保留该集合的某个集合类型,也可以选择不保留该集合的某个集合类型。如果将元素收集到哈希集中,则会丢失顺序。如果收集到树集、LinkedHashSet或任何列表中,您将保留顺序。因此getSortedUsers.forEach和getSortedUsers.forEachOrdered行为相同,因为返回的流是有序的。我说的对吗?@nimo23不。与forEach命令不同,forEach不保证尊重溪流的遭遇顺序。如果使流并行,您将观察到不同的行为。但是如果我不使用并行流,因为流是有序的而不是并行的,forEach必须返回比较器定义的有序序列。或者?@nimo23是的,在顺序流中,forEach应该按照比较器定义的顺序返回元素。对于顺序流,forEach碰巧使用了遭遇顺序,因为这是它的实现方式。但是说明书中没有保证。甚至有一个可以想象的失败场景。假设的实现可能只是在终端操作无序时跳过排序操作。因此getSortedUsers.forEach和getSortedUsers.forEachOrdered行为相同,因为返回的流是有序的。我说的对吗?@nimo23不。与forEach命令不同,forEach不保证尊重溪流的遭遇顺序。如果使流并行,您将观察到不同的行为。但是如果我不使用并行流,因为流是有序的而不是并行的,forEach必须返回比较器定义的有序序列。或者?@nimo23是的,在顺序流中,forEach应该按照比较器定义的顺序返回元素。对于顺序流,forEach碰巧使用了遭遇顺序,因为这是它的实现方式。但是说明书中没有保证。甚至有一个可以想象的失败场景。假设的实现可能只是在终端操作无序时跳过排序操作。