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 yesterday
Nicholas K
5,89951031
5,89951031
asked yesterday
Yassine Ben Hamida
300112
300112
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);
3
good idea in showing a non-stream version. btw it would be better to iterate over thevalues
since you're not doing anything with thek
i.e. you can doList<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
yesterday
@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
yesterday
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
yesterday
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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 yesterday
Aomine
41k74071
41k74071
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);
3
good idea in showing a non-stream version. btw it would be better to iterate over thevalues
since you're not doing anything with thek
i.e. you can doList<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
yesterday
@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
yesterday
add a comment |
Or use forEach
map.forEach((k,v)->list.addAll(v));
or as Aomine commented use this
map.values().forEach(list::addAll);
3
good idea in showing a non-stream version. btw it would be better to iterate over thevalues
since you're not doing anything with thek
i.e. you can doList<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
yesterday
@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
yesterday
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 yesterday
answered yesterday
Hadi J
9,95731743
9,95731743
3
good idea in showing a non-stream version. btw it would be better to iterate over thevalues
since you're not doing anything with thek
i.e. you can doList<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
yesterday
@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
yesterday
add a comment |
3
good idea in showing a non-stream version. btw it would be better to iterate over thevalues
since you're not doing anything with thek
i.e. you can doList<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
1
@Aominevalues()
may involve a construction of an expensive intermediate object, thus simply ignoringk
may be advantageous from a performance perspective.
– oakad
yesterday
@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
yesterday
3
3
good idea in showing a non-stream version. btw it would be better to iterate over the
values
since you're not doing anything with the k
i.e. you can do List<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
good idea in showing a non-stream version. btw it would be better to iterate over the
values
since you're not doing anything with the k
i.e. you can do List<String> result = new ArrayList<>(); map.values().forEach(result::addAll);
– Aomine
yesterday
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
yesterday
@Aomine
values()
may involve a construction of an expensive intermediate object, thus simply ignoring k
may be advantageous from a performance perspective.– oakad
yesterday
@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
yesterday
@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
yesterday
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
yesterday
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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
yesterday
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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 yesterday
nullpointer
43.8k1093180
43.8k1093180
answered yesterday
Ravindra Ranwala
8,56031634
8,56031634
6
Just the apiNote :- TheflatMapping()
collectors are most useful when used in a multi-level reduction, such as downstream of agroupingBy
orpartitioningBy
.
– nullpointer
yesterday
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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
yesterday
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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
yesterday
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
yesterday
8
8
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
It decreases indeed the readability here. The Java 8 way is clearly more relevant here.
– davidxxx
yesterday
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 yesterday
ETO
1,973422
1,973422
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 yesterday
answered yesterday
nullpointer
43.8k1093180
43.8k1093180
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 yesterday
answered yesterday
Nicholas K
5,89951031
5,89951031
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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