Java 8 스트림을 사용하여 문자열의 모든 고유 문자가지도에 있는지 확인하고 해당 키를 목록으로 반환하려고합니다. 다음과 같이 Stream을 사용하여 할 수 있습니다.
...
map.put("Apple",'a');
map.put("Ball",'b');
map.put("Cat",'c');
map.put("Doll",'d');
String format = "aabbbc";
List<String> list = format.chars().mapToObj(i -> (char) i).distinct()
.map(c -> map.entrySet().stream()
.filter(entry -> entry.getValue() == c).findFirst().get().getKey())
.collect(Collectors.toList());
그래서 이것은 나를 반환합니다 ["Apple","Ball","Cat"]
. 그러나 캐릭터가 맵에 없을 수도있는 입력이있을 것입니다. 예를 들면 :format = "aabbbczzzzz"
이 경우 맵에서 캐릭터를 찾을 수 없다는 예외를 던지고 싶습니다. 그래서 나는 이것을했다
List<String> list = format.chars()
.mapToObj(i -> (char) i)
.distinct()
.map(c -> map.entrySet().stream()
.filter(entry -> entry.getValue() == c)
.findFirst()
.orElseThrow(() -> new Exception("Character not found in Map")))
.collect(Collectors.toList());
그러나 Java는 컴파일을 허용하지 않습니다. 내 요구 사항을 처리하는 방법을 도와주세요.
당신이에 전달 람다 표현식 map
A는 Function
당신이 체크 예외를 발생시키지 않는다. 의 계약은 다음 Functions
과 같습니다.
public interface Function<T, R> {
R apply(T t);
}
type 값을 취하고 type 값을 T
반환합니다 R
. 의 구현에서 확인 된 예외를 throw 할 수 없습니다 apply
.
확인되지 않은 예외가 발생하도록 코드를 변경할 수 있습니다.
또한 map
다른 답변에 명시된 바와 같이 맵 키에 매핑 하는 호출 이 누락되었습니다.
List<String> list = format.chars().mapToObj(c -> (char) c).distinct()
.map(c -> map.entrySet().stream()
.filter(entry -> entry.getValue() == c)
.map(Map.Entry::getKey) //extract the map key
.findFirst()
.orElseThrow(() -> new RuntimeException("Character not found in Map")))
.collect(Collectors.toList());
RuntimeException을 확장하고이를 throw하는 사용자 정의 도메인 예외를 생성 할 수도 있습니다.
참조 :
Java Dev Central의 스트림에서 확인 된 예외 발생
참고 : 문자열의 각 문자에 대해 맵을 반복합니다. 성능을 향상시키기 위해 O(1)
캐릭터가 맵에있는 경우 조회 ( )하고 값을 반환 할 수 있도록 리버스 맵을 만들 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다