source

java.util을 변환하고 있습니다.해시맵 속성

goodcode 2022. 9. 22. 00:22
반응형

java.util을 변환하고 있습니다.해시맵 속성

Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>(properties);// why wrong?

java.util.Properties 는 의 실장입니다.또, 의 컨스트럭터는, 다음의 것을 수신합니다.Mapparammody 라고 합니다.그렇다면, 왜 그것을 명시적으로 변환해야 하는가?

는 가 확장되기 때문입니다(이것에 의해,Map<Object, Object>.Map<String, String>따라서 호환되지 않습니다.

문자열 속성을 하나씩 지도에 입력해야 합니다.

예:

for (final String name: properties.stringPropertyNames())
    map.put(name, properties.getProperty(name));

이를 위한 효율적인 방법은 다음과 같이 일반적인 지도에 캐스팅하는 것입니다.

Properties props = new Properties();

Map<String, String> map = (Map)props;

" " " 가 됩니다.Map<Object, Object>(경고만 해당) 컴파일러에 대해 "OK"인 원시 맵으로 이동합니다.MapMap<String, String> 다른 경고될 이다.OK' (알겠습니다).@SuppressWarnings({ "unchecked", "rawtypes" })

JVM에서는 오브젝트에 범용 타입이 없기 때문에 동작합니다.범용 타입은 컴파일 시에 검증하는 트릭에 지나지 않습니다.

키 String이 됩니다.ClassCastException 현재 ★★로 되어 . 전류 있음Properties 슈퍼 콜메서드, 슈퍼 하지 않습니다.Hashtable<Object,Object>Properties.

따라서 Properties 인스턴스에서 나쁜 짓을 하지 않는 것이 좋습니다.

Google Guava를 사용할 수 있습니다.

com.google.common.collect 를 선택합니다.Maps.fromProperties(속성)

이건 어때?

   Map properties = new Properties();
   Map<String, String> map = new HashMap<String, String>(properties);

경고를 발생시키지만 반복 없이 작동합니다.

Java 8의 방법:

properties.entrySet().stream().collect(
    Collectors.toMap(
         e -> e.getKey().toString(),
         e -> e.getValue().toString()
    )
);

Properties를 실장하다Map<Object, Object>안 돼 - 안 돼Map<String, String>.

이 컨스트럭터를 호출하려고 합니다.

public HashMap(Map<? extends K,? extends V> m)

함께...와 함께K ★★★★★★★★★★★★★★★★★」V 다로서String.

★★★★★★★★★★★★★★★★★.Map<Object, Object>안 그래?Map<? extends String, ? extends String>키 및 을 포함할 수 . 문자열이 아닌 키 및 값을 포함할 수 있습니다.

이 방법은 다음과 같습니다.

Map<Object, Object> map = new HashMap<Object, Object>();

하지만 당신에게는 별로 도움이 되지 않을 겁니다

본 fundament fundament fundament fundament fundamentProperties 했다.HashTable그게 문제예요v1 이후로는 의도와는 달리 String 이외의 키와 값을 항상 저장할 수 있게 되었습니다.컴포지션을 대신 사용했다면 API는 문자열 키/값으로만 작동할 수 있었을 것이고 모든 것이 정상이었을 것입니다.

다음과 같은 것이 필요할 수 있습니다.

Map<String, String> map = new HashMap<String, String>();
for (String key : properties.stringPropertyNames()) {
    map.put(key, properties.getProperty(key));
}

com.google.common.collect의 Guava API를 사용합니다.맵 #fromProperties

Properties properties = new Properties();
Map<String, String> map = Maps.fromProperties(properties);

사실을 안다면Properties에는 '''만 .<String, String> 타입에 할 수 .raw 타입은 raw 타입입니다.

Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>((Map) properties);

문제는 말이다Properties용구Map<Object, Object>단,HashMap컨스트럭터는Map<? extends String, ? extends String>.

답변은 이(매우 직관에 반하는) 결정을 설명합니다.한마디로 Java 5 이전에는Properties실장했다Map(그때는 제네릭이 없었기 때문에)즉, 어떤 것이든 Object에 있어서Properties물건.이는 아직 매뉴얼에 기재되어 있습니다.

왜냐면Properties에서 상속하다.Hashtable,그put그리고.putAll메서드는 에 적용할 수 있습니다.Properties물건.발신자가 키 또는 값이 입력되지 않은 엔트리를 삽입할 수 있으므로 이러한 사용은 권장되지 않습니다.Strings. 그setProperty대신 메서드를 사용해야 합니다.

이와 호환성을 유지하기 위해 설계자는 이를 상속할 수밖에 없었습니다.Map<Object, Object>Java 5로 설정합니다.이는 새로운 코드를 불필요하게 복잡하게 만드는 완전한 역호환성을 추구한 결과입니다.

에서 문자열 속성만 사용하는 경우Properties오브젝트는 컨스트럭터에서 체크되지 않은 캐스팅으로 빠져나갈 수 있습니다.

Map<String, String> map = new HashMap<String, String>( (Map<String, String>) properties);

또는 복사본이 없는 경우:

Map<String, String> map = (Map<String, String>) properties;

이는 HashMap의 컨스트럭터에는 Map 범용 타입의 arg가 필요하며 Properties는 Map을 구현하기 때문입니다.

이 방법은 작동하지만 경고와 함께 작동합니다.

    Properties properties = new Properties();
    Map<String, String> map = new HashMap(properties);

다음을 사용할 수 있습니다.

Map<String, String> map = new HashMap<>();

props.forEach((key, value) -> map.put(key.toString(), value.toString()));

일단은

속성 클래스는 해시맵이 아닌 해시테이블을 기반으로 합니다.속성 클래스는 기본적으로 해시 테이블을 확장합니다.

속성 개체를 가져와서 해시 맵 개체를 반환하는 이러한 생성자는 HashMap 클래스에 없습니다.그래서 네가 하는 일은 옳지 않아.해시 테이블 참조에 속성 개체를 캐스팅할 수 있어야 합니다.

나는 이것을 사용한다:

for (Map.Entry<Object, Object> entry:properties.entrySet()) {
    map.put((String) entry.getKey(), (String) entry.getValue());
}

Spring Framework 소스 코드를 보면 이렇게 생각됩니다.

Properties props = getPropertiesFromSomeWhere();
 // change properties to map
Map<String,String> map = new HashMap(props)

언급URL : https://stackoverflow.com/questions/17209260/converting-java-util-properties-to-hashmapstring-string

반응형