如何使用Java流添加所有内容?

2022-09-02 23:27:36

如何使用java 8添加所有内容?

processeditemList is a Map<Integer, Map<Item, Boolean>> 

至于现在,我正在做:

List<Item> itemList = Lists.newLinkedList();
for (Map<Item, Boolean> entry : processeditemList.values()) {
    itemList.addAll(entry.keySet());
}
return itemList;

答案 1

您可以使用平面地图。它用于将多个流合并为一个流。因此,您需要在此处创建一个集合流,然后从每个集合创建一个流:

processeditemList.values().stream()
    .map(Map::keySet)     // Stream<Set<Item>>
    .flatMap(Set::stream) // convert each set to a stream
    .collect(toList());   // convert to list, this will be an ArrayList implmentation by default

如果要更改默认的 List 实现,则可以使用以下收集器:

Collectors.toCollection(LinkedList::new)

如果您不知道列表的最终大小,并且执行的插入操作多于读取,则LinkedList会很好。

ArrayList是oposite:你读得更多,添加/删除更少。因为引擎盖下的 ArrayList 包含一个数组,在添加新元素时必须重新缩放该数组,但在删除元素时永远不会减少该数组。


答案 2

我现在在手机上,所以我不能保证这在语法上是完美的,但这是你如何做到这一点:Stream

processeditemList.values().stream()
    .flatMap(e -> e.keySet().stream())
    .collect(Collectors.toCollection(LinkedList::new));

我目前无法测试它,但是如果Javadocs不正确,我会查看Javadocs并更改任何内容。

编辑:我认为一切都很好。如果使用哪种实现无关紧要,则可以更改List

Collectors.toCollection(LinkedList::new)

Collectors.toList()

推荐