programing

집합을 목록으로 변환하는 가장 간결한 방법

prostudy 2022. 6. 3. 22:31
반응형

집합을 목록으로 변환하는 가장 간결한 방법

예를 들어, 현재 이 작업을 하고 있습니다.

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

이길 수 있겠어?

List<String> list = new ArrayList<String>(listOfTopicAuthors);
List<String> l = new ArrayList<String>(listOfTopicAuthors);

우리가 가지고 있는 것을 고려하면Set<String> stringSet다음을 사용할 수 있습니다.

플레인 자바

List<String> strList = new ArrayList<>(stringSet);

구아바

List<String> strList = Lists.newArrayList(stringSet);

아파치 커먼즈

List<String> strList = new ArrayList<>();
CollectionUtils.addAll(strList, stringSet);

Java 10(수정 불가능한 목록)

List<String> strList = List.copyOf(stringSet);
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8(변경 가능한 목록)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

방법에 대한 문서에 따라toList()

반환된 목록의 유형, 가변성, 직렬성 또는 스레드 안전성에 대한 보장은 없습니다. 반환된 목록에 대한 추가 제어가 필요한 경우 toCollection(공급업체)을 사용하십시오.

따라서 특정 구현이 필요한 경우, 예를 들어 ArrayList다음과 같은 방법으로 얻을 수 있습니다.

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

Java 8(수정 불가능한 목록)

우리는 그것을 활용할 수 있다.Collections::unmodifiableList이전 예에서 반환된 목록을 줄바꿈합니다.독자적인 커스텀 메서드를 다음과 같이 작성할 수도 있습니다.

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

다음으로 다음과 같이 사용합니다.

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

또 다른 가능성은, 을 활용하는 것입니다.collectingAndThen결과를 반환하기 전에 일부 최종 변환을 수행할 수 있는 방법:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

한 가지 주의할 점은 이 방법이Collections::unmodifiableList문서에 따라 지정된 목록의 수정할 수 없는 보기를 반환합니다.수정할 수 없는 뷰 컬렉션은 수정할 수 없는 컬렉션이며 백업 컬렉션에 대한 보기이기도 합니다.백업 컬렉션에 대한 변경은 계속 가능하며 변경이 발생할 경우 수정할 수 없는 보기를 통해 볼 수 있습니다.하지만 수집 방법은Collectors.unmodifiableListJava 10에서 진정한 불변의 목록을 반환합니다.

세트에 대해 다음을 시도합니다.

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

지도에 대해 다음을 시도해 보십시오.

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

Guava를 사용하고 있는 경우는, 스태틱하게 Import 합니다.newArrayListLists 클래스의 메서드:

List<String> l = newArrayList(setOfAuthors);

코드의 문맥상 정확히 뭘 하고 있는지는 모르겠지만...

왜?listOfTopicAuthors변동성이 있나요?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

"...."는 새 것이든 다른 곳에서 온 것이든 간에 세트가 재생된 것을 나타냅니다.

언급URL : https://stackoverflow.com/questions/2319538/most-concise-way-to-convert-a-sett-to-a-listt

반응형