forEach 루프 Java 8 for Map 항목 세트
맵 항목 세트에 대한 각 루프에 대해 java7까지 각 루프에 대해 이전 관습을 java8로 변환하려고 시도하고 있지만 오류가 발생합니다. 변환하려는 코드는 다음과 같습니다.
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
내가 한 변경 사항은 다음과 같습니다.
map.forEach( Map.Entry<String, String> entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
나는 이것을 시도했다.
Map.Entry<String, String> entry;
map.forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
그러나 여전히 오류가 있습니다. 이에 대한 오류는 다음과 같습니다. Lambda 식의 서명이 기능 인터페이스 메서드의 서명과 일치하지 않습니다.accept(String, String)
javadoc 읽기 : as 인수를 Map<K, V>.forEach()
예상 BiConsumer<? super K,? super V>
하고 BiConsumer<T, U>
추상 메소드의 서명은입니다 accept(T t, U u)
.
따라서 두 입력을 인수로받는 람다 식을 전달해야합니다 : 키와 값 :
map.forEach((key, value) -> {
System.out.println("Key : " + key + " Value : " + value);
});
지도 자체가 아니라지도의 항목 집합에서 forEach ()를 호출하면 코드가 작동합니다.
map.entrySet().forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
"어떤 버전이 더 빠르고 어떤 버전을 사용해야합니까?"와 같은 질문에 답하는 가장 좋은 방법 일 수 있습니다. 소스 코드를 살펴 보는 것입니다.
map.forEach () -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);
}
}
map.entrySet (). forEach ()-Iterable.java 에서
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
이것은 map.forEach () 가 내부적으로 Map.Entry 도 사용 하고 있음을 즉시 보여 줍니다 . 따라서 map.entrySet (). forEach ()를 통해 map.forEach () 를 사용하면 성능상의 이점을 기대하지 않습니다 . 따라서 귀하의 경우 대답은 실제로 귀하의 개인적인 취향에 달려 있습니다. :)
차이점의 전체 목록은 제공된 javadoc 링크를 참조하십시오. 즐거운 코딩 되세요!
요구 사항에 대해 다음 코드를 사용할 수 있습니다.
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
HashMap<String,Integer> hm = new HashMap();
hm.put("A",1);
hm.put("B",2);
hm.put("C",3);
hm.put("D",4);
hm.forEach((key,value)->{
System.out.println("Key: "+key + " value: "+value);
});
스트림 API
public void iterateStreamAPI(Map<String, Integer> map) {
map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue()));
}
참고URL : https://stackoverflow.com/questions/32264773/foreach-loop-java-8-for-map-entry-set
'code' 카테고리의 다른 글
사용하지 않고 C ++ 11에서 다중 스레드 안전 싱글 톤을 구현하는 방법 (0) | 2020.10.31 |
---|---|
문자열에서 접두사 제거 (0) | 2020.10.31 |
C의 문자열 패딩 (0) | 2020.10.31 |
md5 해시 바이트 배열을 문자열로 변환 (0) | 2020.10.31 |
SQL Server Management Studio에서 SSIS 패키지를 보려면 어떻게합니까? (0) | 2020.10.30 |