쉽게 컬렉션으로 변환할 수 있는 방법
어플리케이션에서는 서드파티 라이브러리(정확히는 스프링 데이터)를 사용하고 있습니다.
는 반환됩니다.Iterable<T>
부분에는 '''가 기대되지만Collection<T>
.
다른 방법으로 빠르게 변환할 수 있는 유틸리티 방법이 있나요? 것은 .foreach
내 코드에 그런 간단한 루프가 있어
Guava에서는 Lists.newArrayList(Itable) 또는 Sets.newHashSet(Itable) 등의 유사한 메서드를 사용할 수 있습니다.이것에 의해, 물론, 모든 요소가 메모리에 카피됩니다.만약 그게 받아들여지지 않는다면, 이 코드들과 함께 작동되는 당신의 코드는Iterable
Collection
에서 할 수 있는 Collection
Iterable
:Iterables.isEmpty(Iterable)
★★★★★★★★★★★★★★★★★」Iterables.contains(Iterable, Object)
퍼포먼스에 미치는 영향은 더 명확합니다.
JDK 8+에서는 추가 lib를 사용하지 않고 다음을 수행합니다.
Iterator<T> source = ...;
List<T> target = new ArrayList<>();
source.forEachRemaining(target::add);
은 " " " 입니다.Iterator
를 . . .를 with with 를 취급하고 경우Iterable
,
iterable.forEach(target::add);
이 경우, 독자적인 유틸리티 방법을 작성할 수도 있습니다.
public static <E> Collection<E> makeCollection(Iterable<E> iter) {
Collection<E> list = new ArrayList<E>();
for (E item : iter) {
list.add(item);
}
return list;
}
Java 8을 사용한 간결한 솔루션:
public static <T> List<T> toList(final Iterable<T> iterable) {
return StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
}
IteratorUtils
에서commons-collections
될 수 3.2에서는 제네릭스를
@SuppressWarnings("unchecked")
Collection<Type> list = IteratorUtils.toList(iterable.iterator());
4.0은하므로 4.0(현시점에서는을 삭제할 수 .@SuppressWarnings
.
업데이트: 선인장에서 확인.
Collection Utils에서:
List<T> targetCollection = new ArrayList<T>();
CollectionUtils.addAll(targetCollection, iterable.iterator())
이 유틸리티 메서드의 모든 소스를 다음에 나타냅니다.
public static <T> void addAll(Collection<T> collection, Iterator<T> iterator) {
while (iterator.hasNext()) {
collection.add(iterator.next());
}
}
Iterable
스프링 데이터에는 몇 가지 다른 대안이 있습니다.
수 .
Iterable
「」를에서, 「」를 참조해 주세요.List
,Set
또는 이 방법으로 Spring Data를 변환할 수 있습니다.모든 리포지토리 인터페이스에서 재정의를 반복할 필요가 없도록 리포지토리의 슈퍼 인터페이스에서 이를 수행할 수 있습니다.
Data JPA를 는 Spring Data JPA에서 .
JpaRepository
은 조금 에 말씀드린 '변환'을 .
Streamable
다음 중 하나:Iterable<X> iterable = repo.findAll(); List<X> list = Streamable.of(iterable).toList();
화났다고 , 것 같은데, 화났다고 하다, 화났다고 한다, 화났다고 .Iterable
도움이 됩니다.
- 제로 a a a a a a a a a a a a a a a a를 필요로 하는 경우는 매우 드물 것으로 됩니다.
Collection
은은경경경경차차차차없겁 - 할 수 .
Collection
하게 됩니다.Streamable
모든 요소를 가져오기 전에 저장소에서 결과를 반환할 수 있는 경우를 대상으로 합니다. Streamable
、 would would type type,,,,,,,,,,,,,,,,,,ionsionsions로 쉽게 할 수 에 실제로는 이 됩니다.왜냐하면 쉽게 변환할 수 있기 때문입니다.List
,Set
,Stream
그 자체가Iterable
이 많은 을 어플리케이션에서
그 동안, 모든 컬렉션은 유한하지만, Itable은 어떤 약속도 없다는 것을 잊지 마세요.만약 어떤 것이 견딜 수 있다면, 당신은 반복기를 얻을 수 있고, 그것으로 끝이다.
for (piece : sthIterable){
..........
}
다음과 같이 확장됩니다.
Iterator it = sthIterable.iterator();
while (it.hasNext()){
piece = it.next();
..........
}
it.hasNext()는 false를 반환할 필요가 없습니다.따라서 일반적인 경우 모든 Itable을 Collection으로 변환할 수 없습니다.예를 들어, 모든 양의 자연수에 대해 반복하거나, 동일한 결과를 반복적으로 생성하는 주기가 있는 무언가에 대해 반복할 수 있습니다.
그렇지 않은 경우:Atrey의 대답은 꽤 괜찮다.
용 i i i i를 쓴다.FluentIterable.from(myIterable).toList()
비슷한 상황을 맞닥뜨렸습니다.List
Project
「」가 「」를 참조해 .Iterable<T> findAll()
되어 있다CrudRepository
인터페이스입니다.제 래래 my my my ProjectRepository
에서 )CrudRepository
), 「 」라고 선언했을 findAll()
List<Project>
Iterable<Project>
.
package com.example.projectmanagement.dao;
import com.example.projectmanagement.entities.Project;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface ProjectRepository extends CrudRepository<Project, Long> {
@Override
List<Project> findAll();
}
이것은 변환 로직이나 외부 라이브러리를 사용하지 않고 가장 간단한 해결책이라고 생각합니다.
이것은 당신의 질문에 대한 답은 아니지만, 저는 이것이 당신의 문제에 대한 해결책이라고 생각합니다. " " "org.springframework.data.repository.CrudRepository
.java.lang.Iterable
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아. 서브이 경우는 서브 인터페이스를 사용합니다.org.springframework.data.mongodb.repository.MongoRepository
에는 타입의 java.util.List
.
가능한 경우 커스텀 유틸리티를 사용하여 기존 컬렉션을 캐스팅합니다.
메인:
public static <T> Collection<T> toCollection(Iterable<T> iterable) {
if (iterable instanceof Collection) {
return (Collection<T>) iterable;
} else {
return Lists.newArrayList(iterable);
}
}
이상적으로는 상기의 경우 UnmutableList를 사용하지만 UnmutableCollection에서는 바람직하지 않은 결과를 얻을 수 있는 늘을 허용하지 않습니다.
테스트:
@Test
public void testToCollectionAlreadyCollection() {
ArrayList<String> list = Lists.newArrayList(FIRST, MIDDLE, LAST);
assertSame("no need to change, just cast", list, toCollection(list));
}
@Test
public void testIterableToCollection() {
final ArrayList<String> expected = Lists.newArrayList(FIRST, null, MIDDLE, LAST);
Collection<String> collection = toCollection(new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return expected.iterator();
}
});
assertNotSame("a new list must have been created", expected, collection);
assertTrue(expected + " != " + collection, CollectionUtils.isEqualCollection(expected, collection));
}
컬렉션의 모든 서브타입(Set, List 등)에 대해 동일한 유틸리티를 구현하고 있습니다.이미 구아바의 일부라고 생각했지만, 아직 찾지 못했습니다.
contains
,containsAll
,equals
,hashCode
,remove
,retainAll
,size
★★★★★★★★★★★★★★★★★」toArray
어쨌든 당신은 그 요소들을 통과해야 할 것이다.
하다, 하다, 하다, 하다, 하다 같은 으로만 전화를 .isEmpty
★★★★★★★★★★★★★★★★★」clear
컬렉션을 느긋하게 만드는 게 나을 것 같네요., 뒷바라지, 등이 있습니다.ArrayList
이전에 반복된 요소를 저장합니다.
도서관에 그런 수업이 있는지 모르지만, 그것은 쓰기 꽤 간단한 연습일 것이다.
8에서 모든 할 수 .Iterable
로로 합니다.Collection
★★★★
public static <T> Collection<T> iterableToCollection(Iterable<T> iterable) {
Collection<T> collection = new ArrayList<>();
iterable.forEach(collection::add);
return collection;
}
@Afreys의 답변에서 영감을 얻었다.
RxJava가 망치이고 이게 못처럼 생겼으니까
Observable.from(iterable).toList().toBlocking().single();
Java 8에서 이를 실현하기 위한 뛰어난 방법을 나타내는SSCCE를 다음에 나타냅니다.
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class IterableToCollection {
public interface CollectionFactory <T, U extends Collection<T>> {
U createCollection();
}
public static <T, U extends Collection<T>> U collect(Iterable<T> iterable, CollectionFactory<T, U> factory) {
U collection = factory.createCollection();
iterable.forEach(collection::add);
return collection;
}
public static void main(String[] args) {
Iterable<Integer> iterable = IntStream.range(0, 5).boxed().collect(Collectors.toList());
ArrayList<Integer> arrayList = collect(iterable, ArrayList::new);
HashSet<Integer> hashSet = collect(iterable, HashSet::new);
LinkedList<Integer> linkedList = collect(iterable, LinkedList::new);
}
}
의존 관계가 없는 단순한 한 줄짜리 솔루션은 보이지 않았습니다.간단한 사용
List<Users> list;
Iterable<IterableUsers> users = getUsers();
// one line solution
list = StreamSupport.stream(users.spliterator(), true).collect(Collectors.toList());
두 가지 발언
- Foreach 루프를 사용하기 위해 Itable을 Collection으로 변환할 필요는 없습니다.이러한 루프는 직접 사용할 수 있으며 구문적인 차이는 없기 때문에 원래 질문이 왜 나왔는지 전혀 이해할 수 없습니다.
- Itable을 Collection으로 변환하는 권장 방법은 안전하지 않습니다(Collection Utils와 동일). next() 메서드에 대한 후속 호출이 다른 개체 인스턴스를 반환한다는 보장은 없습니다.게다가, 이 우려는 순전히 이론적인 것이 아니다.예를 들어, Hadoop Reducer의 축소 방법에 값을 전달하는 데 사용되는 반복 가능한 구현은 항상 다른 필드 값을 사용하여 동일한 값 인스턴스를 반환합니다.따라서 위에서 makeCollection(또는 CollectionUtils.addAll(Iterator))을 적용하면 모든 요소가 동일한 컬렉션이 됩니다.
★★를 해 보세요.StickyList
선인장:
List<String> list = new StickyList<>(iterable);
파티에는 늦었지만, 라이브러리 없이 T의 반복 가능을 T의 컬렉션으로 변환할 수 있는 매우 우아한 Java 8 솔루션을 만들었습니다.
public static <T, C extends Collection<T>> C toCollection(Iterable<T> iterable, Supplier<C> baseSupplier)
{
C collection = baseSupplier.get();
iterable.forEach(collection::add);
return collection;
}
사용 예:
Iterable<String> iterable = ...;
List<String> list = toCollection(iterable, ArrayList::new);
Eclipse Collections 팩토리를 사용할 수 있습니다.
Iterable<String> iterable = Arrays.asList("1", "2", "3");
MutableList<String> list = Lists.mutable.withAll(iterable);
MutableSet<String> set = Sets.mutable.withAll(iterable);
MutableSortedSet<String> sortedSet = SortedSets.mutable.withAll(iterable);
MutableBag<String> bag = Bags.mutable.withAll(iterable);
MutableSortedBag<String> sortedBag = SortedBags.mutable.withAll(iterable);
도 할 수 있어요.Iterable
a까지LazyIterable
컨버터 메서드 또는 사용 가능한 다른 API를 사용합니다.
Iterable<String> iterable = Arrays.asList("1", "2", "3");
LazyIterable<String> lazy = LazyIterate.adapt(iterable);
MutableList<String> list = lazy.toList();
MutableSet<String> set = lazy.toSet();
MutableSortedSet<String> sortedSet = lazy.toSortedSet();
MutableBag<String> bag = lazy.toBag();
MutableSortedBag<String> sortedBag = lazy.toSortedBag();
것.Mutable
가 늘다java.util.Collection
.
주의: 저는 Eclipse Collections의 커밋입니다.
캐스팅을 시험해 보세요:(List<iterable_type>)iterable;
언급URL : https://stackoverflow.com/questions/6416706/easy-way-to-convert-iterable-to-collection
'programing' 카테고리의 다른 글
VueJ에서 작동하지 않는 Vuex 저장소 어레이에 푸시s (0) | 2022.07.16 |
---|---|
체크박스에 vue-fontawesome을 사용할 수 있습니까? (0) | 2022.07.16 |
L1 캐시의 Haswell에서 최대 대역폭 확보: 62%밖에 확보하지 못함 (0) | 2022.07.16 |
v-model이 구성 요소의 로컬 데이터 대신 Vuex 상태를 변환하는 이유는 무엇입니까? (0) | 2022.07.16 |
mongoose 모델에서 중첩된 데이터를 쿼리하는 방법 (0) | 2022.07.16 |