use*_*267 9 java java-8 java-stream
如何使用java 8添加所有内容?
processeditemList is a Map<Integer, Map<Item, Boolean>>
Run Code Online (Sandbox Code Playgroud)
至于现在我在做:
List<Item> itemList = Lists.newLinkedList();
for (Map<Item, Boolean> entry : processeditemList.values()) {
itemList.addAll(entry.keySet());
}
return itemList;
Run Code Online (Sandbox Code Playgroud)
Ber*_*eri 18
您可以使用flatMap.它用于将多个流组合成一个流.所以在这里你需要创建一个集合流,然后从每个集合中创建一个流:
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
Run Code Online (Sandbox Code Playgroud)
如果要更改默认的List实现,则可以使用下面的收集器:
Collectors.toCollection(LinkedList::new)
Run Code Online (Sandbox Code Playgroud)
如果您不知道列表的最终大小,并且您执行的插入操作多于读取,则LinkedList会很好.
ArrayList是相反的:你读的越多,添加/删除的越少.因为引擎盖下的ArrayList包含一个数组,在添加新元素时必须重新调整,但在删除元素时永远不会减少.
Jac*_* G. 13
我现在正在打电话,所以我不能保证这在语法上是完美的,但是你可以用以下方法来做到这一点Stream:
processeditemList.values().stream()
.flatMap(e -> e.keySet().stream())
.collect(Collectors.toCollection(LinkedList::new));
Run Code Online (Sandbox Code Playgroud)
我目前无法测试它,但如果它不正确,我会查看Javadoc并更改任何内容.
编辑:我认为一切都很好.如果List使用哪种实现无关紧要,您可以更改
Collectors.toCollection(LinkedList::new)
Run Code Online (Sandbox Code Playgroud)
至
Collectors.toList()
Run Code Online (Sandbox Code Playgroud)