How to get a List from a HashMap<String,List>
I want to extract a List<E>
from a Map<String,List<E>>
(E
is a random Class) using stream()
.
I want a simple one-line method using java 8's stream.
What I have tried until now :
HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
java collections java-8 java-stream collectors
add a comment |
I want to extract a List<E>
from a Map<String,List<E>>
(E
is a random Class) using stream()
.
I want a simple one-line method using java 8's stream.
What I have tried until now :
HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
java collections java-8 java-stream collectors
add a comment |
I want to extract a List<E>
from a Map<String,List<E>>
(E
is a random Class) using stream()
.
I want a simple one-line method using java 8's stream.
What I have tried until now :
HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
java collections java-8 java-stream collectors
I want to extract a List<E>
from a Map<String,List<E>>
(E
is a random Class) using stream()
.
I want a simple one-line method using java 8's stream.
What I have tried until now :
HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
java collections java-8 java-stream collectors
java collections java-8 java-stream collectors
edited Jan 6 at 4:36


Nicholas K
6,59261132
6,59261132
asked Jan 5 at 17:31


Yassine Ben HamidaYassine Ben Hamida
370113
370113
add a comment |
add a comment |
6 Answers
6
active
oldest
votes
map.values()
returns a Collection<List<E>>
not a List<E>
, if you want the latter then you're required to flatten the nested List<E>
into a single List<E>
as follows:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
add a comment |
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
Jan 6 at 7:01
@oakad You're correct in the sense thatvalues
may involve creating a new object but note that the returned collection byvalues
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which meansmap.values().forEach(list::addAll)
.
– Aomine
Jan 6 at 10:13
add a comment |
Here's an alternate way to do it with Java-9 and above:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
Jan 5 at 17:46
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
add a comment |
In addition to other answers:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
This could also do the trick.
add a comment |
You can use Collection.stream
with flatMap
as:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
or use a non-stream version as:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
add a comment |
Simply use :-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54054448%2fhow-to-get-a-liste-from-a-hashmapstring-liste%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
map.values()
returns a Collection<List<E>>
not a List<E>
, if you want the latter then you're required to flatten the nested List<E>
into a single List<E>
as follows:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
add a comment |
map.values()
returns a Collection<List<E>>
not a List<E>
, if you want the latter then you're required to flatten the nested List<E>
into a single List<E>
as follows:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
add a comment |
map.values()
returns a Collection<List<E>>
not a List<E>
, if you want the latter then you're required to flatten the nested List<E>
into a single List<E>
as follows:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
map.values()
returns a Collection<List<E>>
not a List<E>
, if you want the latter then you're required to flatten the nested List<E>
into a single List<E>
as follows:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
answered Jan 5 at 17:32


AomineAomine
41.9k74071
41.9k74071
add a comment |
add a comment |
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
Jan 6 at 7:01
@oakad You're correct in the sense thatvalues
may involve creating a new object but note that the returned collection byvalues
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which meansmap.values().forEach(list::addAll)
.
– Aomine
Jan 6 at 10:13
add a comment |
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
Jan 6 at 7:01
@oakad You're correct in the sense thatvalues
may involve creating a new object but note that the returned collection byvalues
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which meansmap.values().forEach(list::addAll)
.
– Aomine
Jan 6 at 10:13
add a comment |
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
edited Jan 5 at 17:42
answered Jan 5 at 17:39


Hadi JHadi J
10.2k31744
10.2k31744
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
Jan 6 at 7:01
@oakad You're correct in the sense thatvalues
may involve creating a new object but note that the returned collection byvalues
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which meansmap.values().forEach(list::addAll)
.
– Aomine
Jan 6 at 10:13
add a comment |
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
Jan 6 at 7:01
@oakad You're correct in the sense thatvalues
may involve creating a new object but note that the returned collection byvalues
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which meansmap.values().forEach(list::addAll)
.
– Aomine
Jan 6 at 10:13
1
1
@Aomine
values()
may involve a construction of an expensive intermediate object, thus simply ignoring k
may be advantageous from a performance perspective.– oakad
Jan 6 at 7:01
@Aomine
values()
may involve a construction of an expensive intermediate object, thus simply ignoring k
may be advantageous from a performance perspective.– oakad
Jan 6 at 7:01
@oakad You're correct in the sense that
values
may involve creating a new object but note that the returned collection by values
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which means map.values().forEach(list::addAll)
.– Aomine
Jan 6 at 10:13
@oakad You're correct in the sense that
values
may involve creating a new object but note that the returned collection by values
is lazily created once, thereafter, the same instance will be returned. So it's not so expensive after all. Further, I'd favour readability here which means map.values().forEach(list::addAll)
.– Aomine
Jan 6 at 10:13
add a comment |
Here's an alternate way to do it with Java-9 and above:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
Jan 5 at 17:46
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
add a comment |
Here's an alternate way to do it with Java-9 and above:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
Jan 5 at 17:46
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
add a comment |
Here's an alternate way to do it with Java-9 and above:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
Here's an alternate way to do it with Java-9 and above:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
edited Jan 6 at 5:44


nullpointer
46.5k1199190
46.5k1199190
answered Jan 5 at 17:33


Ravindra RanwalaRavindra Ranwala
9,06031634
9,06031634
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
Jan 5 at 17:46
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
add a comment |
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
Jan 5 at 17:46
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
6
6
Just the apiNote :- The
flatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of a groupingBy
or partitioningBy
.– nullpointer
Jan 5 at 17:46
Just the apiNote :- The
flatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of a groupingBy
or partitioningBy
.– nullpointer
Jan 5 at 17:46
9
9
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
Jan 5 at 17:52
add a comment |
In addition to other answers:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
This could also do the trick.
add a comment |
In addition to other answers:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
This could also do the trick.
add a comment |
In addition to other answers:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
This could also do the trick.
In addition to other answers:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
This could also do the trick.
answered Jan 5 at 17:40


ETOETO
2,663526
2,663526
add a comment |
add a comment |
You can use Collection.stream
with flatMap
as:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
or use a non-stream version as:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
add a comment |
You can use Collection.stream
with flatMap
as:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
or use a non-stream version as:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
add a comment |
You can use Collection.stream
with flatMap
as:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
or use a non-stream version as:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
You can use Collection.stream
with flatMap
as:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
or use a non-stream version as:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
edited Jan 6 at 4:39
answered Jan 5 at 17:38


nullpointernullpointer
46.5k1199190
46.5k1199190
add a comment |
add a comment |
Simply use :-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
add a comment |
Simply use :-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
add a comment |
Simply use :-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
Simply use :-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
edited Jan 6 at 4:37
answered Jan 5 at 17:34


Nicholas KNicholas K
6,59261132
6,59261132
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54054448%2fhow-to-get-a-liste-from-a-hashmapstring-liste%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown