[java] Set <T>를 List <T>로 변환하는 가장 간결한 방법

예를 들어, 나는 현재 이것을하고있다 :

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다음을 사용할 수 있다고 생각합니다 .

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

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

Java 8 (수정 가능한 목록)

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

방법에 대한 의사 에 따라toList()

리턴 된 List의 유형, 변경 가능성, 직렬화 가능성 또는 스레드 안전성에 대한 보장은 없습니다. 리턴 된 List에 대한 추가 제어가 필요한 경우 toCollection (Supplier)을 사용하십시오.

따라서 특정 구현이 필요한 경우 예를 들어 다음과 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을 위해 이것을보십시오 :

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를 사용하는 경우 Lists 클래스 newArrayList에서 메소드 를 정적으로 가져옵니다 .

List<String> l = newArrayList(setOfAuthors);


답변

코드의 컨텍스트를 통해 정확히 무엇을하고 있는지 확실하지 않지만 …

listOfTopicAuthors변수를 전혀 만들지 않습니까?

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

“….”은 새로운 것이든지 다른 위치에서 온 것이 든 세트가 작동한다는 것을 나타냅니다.


답변