Read the javadoc: Map<K, V>.forEach() expects a BiConsumer<? super K,? super V> as argument, and the signature of the BiConsumer<T, U> abstract method is accept(T t, U u).
So you should pass it a lambda expression that takes two inputs as argument: the key and the value:
map.forEach((key, value) -> {
System.out.println("Key : " + key + " Value : " + value);
});
Your code would work if you called forEach() on the entry set of the map, not on the map itself:
map.entrySet().forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Answer from JB Nizet on Stack OverflowRead the javadoc: Map<K, V>.forEach() expects a BiConsumer<? super K,? super V> as argument, and the signature of the BiConsumer<T, U> abstract method is accept(T t, U u).
So you should pass it a lambda expression that takes two inputs as argument: the key and the value:
map.forEach((key, value) -> {
System.out.println("Key : " + key + " Value : " + value);
});
Your code would work if you called forEach() on the entry set of the map, not on the map itself:
map.entrySet().forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Maybe the best way to answer the questions like "which version is faster and which one shall I use?" is to look to the source code:
map.forEach() - from Map.java
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch(IllegalStateException ise) {
// this usually means the entry is no longer in the map.
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
javadoc
map.entrySet().forEach() - from Iterable.java
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
javadoc
This immediately reveals that map.forEach() is also using Map.Entry internally. So I would not expect any performance benefit in using map.forEach() over the map.entrySet().forEach(). So in your case the answer really depends on your personal taste :)
For the complete list of differences please refer to the provided javadoc links. Happy coding!
What is the difference between map and forEach in Java streams in this case?
Is java8 foreach on a map thread safe?
Why does the List interface have forEach, but not map?
How To Iterate Over Hashmap In A For-Loop Context?
I know map is not a terminal operation, but could someone explain this in more detail?
userList.stream().map(i -> {
System.out.println(i);
return 0;
}).collect(Collectors.toList());
// VS
userList.forEach(System.out::println);If I iterate using it.next() through a map and use a thread within the loop it doesn't work as expected. Is using the java8 foreach safe? I would have thought it were safe but I'm getting so extra loops in there I didn't expect eg
this.mymap.forEach(
(k, v) -> {
new Thread() {
public void run() {
Messages message = (Messages) v; //is this thread safe?
//do http request to api
}
}.start();
});