【问题标题】:Collect a Stream to a LinkedList [duplicate]将流收集到 LinkedList [重复]
【发布时间】:2016-07-18 09:56:04
【问题描述】:

通过List 流式传输时,如何将输出收集到链表?

我尝试了以下方法:

public static void main(String[] args) {
    List<String> firstList = new ArrayList<>();
    firstList.add("pavan");
    firstList.add("kumar");
    LinkedList<String> filtered= new LinkedList<>();
    filtered = (LinkedList<String>) firstList.stream().filter(t->firstList.contains("p")).collect(Collectors.toList());
    System.out.println(filtered);        
}

但这给 java.util.ArrayList 不能转换为 java.util.LinkedList。

【问题讨论】:

  • 是否有特殊原因为什么您需要LinkedList 并且不能针对List 接口进行编码?
  • 我想用LinkedList实现的Deque接口方法
  • 好的,最好还是针对接口编写代码并将变量声明为Deque&lt;String&gt;
  • @MickMnemonic 怎么样
  • 这样做会使以后切换到另一个实现变得更简单(例如ArrayDequeConcurrentLinkedDequeLinkedBlockingDeque)。总的来说,这是一个好主意的更多原因,请参见这篇文章:What does it mean to “program to an interface”?

标签: java java-8 java-stream


【解决方案1】:

collect(Collectors.toList()) 返回一个List。你不能假设它会返回哪个List 实现。

使用Collectors.toCollection(),指定您希望将数据收集到的实际Collection(或List)实现:

LinkedList<String> filtered =
    firstList.stream()
             .filter(t->firstList.contains("p"))
             .collect(Collectors.toCollection(LinkedList::new));

【讨论】:

    【解决方案2】:

    使用构造函数

     filtered = new LinkedList<String>(firstList.stream().filter(t->firstList.contains("p")).collect(Collectors.toList());
    

    链表构造函数将Collection 作为参数,因此asList() 的任何返回都将兼容

    【讨论】:

    • 使用.collect(Collectors.toCollection(LinkedList::new)) 效率更高。如果您使用复制构造函数,将创建 2 个列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2020-07-02
    • 2019-07-04
    相关资源
    最近更新 更多