流式传输到LinkedHashSet

时间:2018-08-21 08:49:54

标签: java java-8 java-stream

我想以自然顺序将.csv保存到LinkedHashSet中,因此.csv的第一行应该是LinkedHashSet的第一元素。

文件如下:

java  
c  
c++  
assembly language  
swift  

和我的代码如下:

public class test {   
    public static void main(String[] args) throws IOException {         
         final Charset ENCODING = Charset.forName("Cp1250");
         Path fileToLoad = Paths.get("src/main/resources/test.csv");
         Set<String> x = Files.lines(fileToLoad, ENCODING)
                 .map(Function.identity())
                 .collect(Collectors.toSet());

         Iterator<String> it = x.iterator();
         while(it.hasNext()) {
             System.out.println(it.next());
         }
    }
}

但是返回错误的顺序:

assembly language
c++
java
c
swift

我认为该流只是将其另存为HashSet。

是否可以通过流将其另存为LinkedHashSet?

4 个答案:

答案 0 :(得分:5)

您只是不知道该工厂方法创建的特定类型(guarantees返回 Set ,仅此而已)。

唯一可靠的方法是通过结束流操作

来实际控制
... collect( Collectors.toCollection( LinkedHashSet::new ) );

答案 1 :(得分:1)

  

返回此集合中元素的迭代器。元素以不特定的顺序返回(除非此集合是提供保证的某些类的实例)。

请参见https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator()

使用List而不是Set

答案 2 :(得分:1)

.collect(Collectors.toSet())不会创建LinkedHashSet,而是常规的HashSet。 而是使用.collect(Collectors.toCollection(LinkedHashSet::new)来确保正在使用LinkedHashSet

答案 3 :(得分:0)

一个集合通常是无序的,但是有一个排序的集合在存储过程中效率不高,但是仅保留次序和唯一元素

检查是否可以使用此命令:http://www.java2s.com/Tutorials/Java/Java_Collection/0110__Java_Sorted_Set.htm