컬렉션을 어레이로 변환하는 가장 쉬운 방법
예를 들어,Collection<Foo>
. (현재 컨텍스트에서 LoC에서 가장 짧은) 변환 방법은 무엇입니까?Foo[]
잘 알려진 라이브러리는 모두 허용됩니다.
UPD: (이 섹션의 한 가지 케이스가 더 있습니다.다른 스레드를 작성할 필요가 있다고 생각되는 경우는, 코멘트를 남겨 주세요).변혁은 어떨까요?Collection<Foo>
로.Bar[]
어디에Bar
유형의 매개 변수가 1개인 생성자가 있음Foo
예.public Bar(Foo foo){ ... }
?
어디에x
는 컬렉션입니다.
Foo[] foos = x.toArray(new Foo[x.size()]);
Java 8을 사용하여 업데이트된 질문에 대한 대체 솔루션:
Bar[] result = foos.stream()
.map(x -> new Bar(x))
.toArray(size -> new Bar[size]);
여러 번 또는 루프에서 사용하는 경우 상수를 정의할 수 있습니다.
public static final Foo[] FOO = new Foo[]{};
변환하는 방법을 가르쳐 주세요.
Foo[] foos = fooCollection.toArray(FOO);
그toArray
method는 빈 어레이를 사용하여 타깃 어레이의 올바른 유형을 결정하고 새 어레이를 만듭니다.
업데이트에 대한 제안서는 다음과 같습니다.
Collection<Foo> foos = new ArrayList<Foo>();
Collection<Bar> temp = new ArrayList<Bar>();
for (Foo foo:foos)
temp.add(new Bar(foo));
Bar[] bars = temp.toArray(new Bar[]{});
JDK/11을 사용하는 경우, 다른 변환 방법인Collection<Foo>
에 대해서Foo[]
다음과 같이 사용할 수 있습니다.
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
메일링 리스트의 @Stuart에서 설명한 바와 같이 (강조된) 퍼포먼스는 기본적으로 기존 퍼포먼스와 같아야 합니다.
결론은 다음과 같은 구현이러한 구현은
Arrays.copyOf(
)가 가장 빠릅니다.아마 본질적인 것이기 때문일 것입니다.어레이 내용 전체를 덮어쓸 수 있으므로 새로 할당된 어레이가 0으로 채워지는 것을 방지할 수 있습니다.이는 퍼블릭 API의 외관에 관계없이 해당됩니다.
JDK 내의 API 실장은 다음과 같습니다.
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
디폴트 실장 콜
generator.apply(0)
0-Length 어레이를 취득하고 콜만 하면 됩니다.toArray(T[])
. 이것은 를 통과합니다.Arrays.copyOf()
빠른 경로이므로 기본적으로 와 같은 속도입니다.
참고: API 사용은 다음 코드와 함께 하위 비호환성과 함께 안내되어야 합니다.null
예를 들어, 이러한 콜은 기존 콜 때문에 모호하기 때문에toArray(T[] a)
컴파일에 실패합니다.
프로젝트에서 Guava를 사용하는 경우 를 사용할 수 있습니다.
Foo[] foos = Iterables.toArray(x, Foo.class);
다음은 사례 업데이트 섹션의 최종 해결 방법입니다(Google 컬렉션 지원).
Collections2.transform (fooCollection, new Function<Foo, Bar>() {
public Bar apply (Foo foo) {
return new Bar (foo);
}
}).toArray (new Bar[fooCollection.size()]);
단, 여기서의 주요 접근법은 doublep의 답변에 언급되어 있습니다(잊고 있었습니다).toArray
메서드).
원본에 대해서는 doublep 답변을 참조하십시오.
Foo[] a = x.toArray(new Foo[x.size()]);
업데이트에 대해서:
int i = 0;
Bar[] bars = new Bar[fooCollection.size()];
for( Foo foo : fooCollection ) { // where fooCollection is Collection<Foo>
bars[i++] = new Bar(foo);
}
실제로 현대 자바에서는 명시적인 크기를 설정하지 않은 버전이 더 빠릅니다.SO 답변 참조:
.toArray(새로운 MyClass[0]) 또는 .toArray(새로운 MyClass[myList.size()])?
이것은, 독자적인 조사와 인텔리J의 팀에 의해서 뒷받침되고 있습니다.
즉, 이것이 오늘날 가장 빠른 접근법입니다.
Foo[] foos = x.toArray(new Foo[0])
또는, 조금 더 안전하다면, 더 좋을 것이다.
Foo[] foos = x == null ? null : x.toArray(new Foo[0])
Foo[] foos = x.toArray(새로운 Foo[0]);
예를 들어 Student 클래스 요소가 포함된 ArrayList 컬렉션이 있다고 가정합니다.
List stuList = new ArrayList();
Student s1 = new Student("Raju");
Student s2 = new Student("Harish");
stuList.add(s1);
stuList.add(s2);
//now you can convert this collection stuList to Array like this
Object[] stuArr = stuList.toArray(); // <----- toArray() function will convert collection to array
언급URL : https://stackoverflow.com/questions/3293946/the-easiest-way-to-transform-collection-to-array
'programing' 카테고리의 다른 글
Java null을 통해 .timeout() 대신 ==을 사용하는 이유를 확인합니다. (0) | 2022.09.17 |
---|---|
SQLSTATE[HY000]: 일반 오류: Larabel에서 2053 오류가 발생합니다. (0) | 2022.09.17 |
#1071 - 지정된 키가 너무 깁니다. 최대 키 길이는 1000바이트입니다. (0) | 2022.09.17 |
CTE를 사용하지 않고 SQL 쿼리에서 계층적 결과(pedigree)를 생성하는 방법 (0) | 2022.09.17 |
테이블에 삽입하여 테이블에서 선택합니다. 여기서 열 이름 = xxx 및 열 이름 2 = yyy 루프가 너무 많습니다. (0) | 2022.09.17 |