用于设置和保留订单的Java Stream Map List

isA*_*Don 1 java java-stream

我有一个Answer类和一个User类.

答案有一个getUser()和用户有一个getPoints()

从答案列表中我想得到一个按点排序的用户哈希集.我试过以下:

 Set<User> collectSet = list.stream().map(Answer::getUser)
            .sorted(Comparator.comparing(User::getPoints))
            .collect(Collectors.toCollection(HashSet::new));

 collectSet.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎没有保留顺序.输出总是不同的.

有趣的是,列表的相同示例可以正常工作

List<User> collectList = list.stream().map(Answer::getUser)
            .sorted(Comparator.comparing(User::getPoints))
            .collect(Collectors.toList());

collectList.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Eug*_*ene 5

 Collectors.toCollection(LinkedHashSet::new)
Run Code Online (Sandbox Code Playgroud)

首先,你根据一些条目对这些条目进行排序Comparator- 给它们"一些"顺序,但是然后你把它们放入一个HashSet(顺序被破坏),从而产生不同的结果.使用LinkedHashSet收集它们,以保持排序顺序.

如果您仍想将它们收集到a List,您可以:

 yourList.stream()
         .sorted(....)
         .distinct() 
         .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

操作顺序(distinctvs sorted)很重要