Skip to content

Proposal: Add FromIterator impl for HashMap<K, Vec<V>> #3351

Open

Description

Summary

I'm proposing a small quality of life improvement, that I was surprised to find wasn't already a part of the language.
I want to introduce a new FromIterator<(K, V)> implementation for HashMap<K, Vec<V>>.

I'm happy to create a PR for this if we want to move forward.

Note: I tried asking this on internals, without any responses, so am hoping to get more traction here.

Motivation

It's relatively common to want to group a list of values over some specific key. The current method of doing this either requires a third party crate or manually constructing the HashMap in a for loop, making use of the Entry API.

This is common enough that I was surprised not to see an ergonomic approach using collect. This RFC proposes adding an impl to make this possible.

Example

As an example, imagine you had a list of books, and wanted to group the books by the author that wrote them.

Current Implementation

let mut books_by_author: HashMap<&str, Vec<&Book>> = HashMap::new();  
  
for book in &books {  
    books_by_author.entry(book.author).or_default().push(book);  
}

With This Proposal

let books_by_author: HashMap<&str, Vec<&Book>> =
    books.iter().map(|book| (book.author, book)).collect();

Future Considerations

  • Instead of adding this implementation for just Vec<V>, we could consider adding it for all collections C: Default + Extend<V>, extending this functionality to all collections, such as a HashSet.

Prior Art

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    T-libs-apiRelevant to the library API team, which will review and decide on the RFC.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions