将一个流收集到LinkedList中

5

在通过 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 接口编码,是否有特殊原因? - Mick Mnemonic
我想使用由LinkedList实现的Deque接口方法。 - nanpakal
这样做将使以后切换到另一个实现(例如 ArrayDequeConcurrentLinkedDequeLinkedBlockingDeque)更加简单。在此 post 中,还有更多为什么这是一个好主意的原因:什么是“面向接口编程”? - Mick Mnemonic
我想问一下如何命名变量,例如Deque<String>,同时仍然针对接口进行编码。你能解释一下吗? - nanpakal
使用 Deque<String> filtered=firstList.stream() .filter(t -> t.contains("p")) .collect(Collectors.toCollection(ArrayDeque::new));。请注意,我将 LinkedList 替换为 ArrayDeque,因为即使您需要一个 Deque,也没有真正使用 LinkedList 的用例。此外,我将您的过滤表达式替换为更符合您意图的内容。 - Holger
显示剩余2条评论
2个回答

21

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

使用Collectors.toCollection(),指定实际的Collection(或在您的情况下是List)实现,您希望将数据收集到其中:

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

-1
使用构造函数。
 filtered = new LinkedList<String>(firstList.stream().filter(t->firstList.contains("p")).collect(Collectors.toList());

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


3
如果使用.collect(Collectors.toCollection(LinkedList::new)),则效率更高。如果使用复制构造函数,则会创建两个列表。 - Vladimir Vagaytsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接