구아바 : Lists.filter () 함수가없는 이유는 무엇입니까?
이유가 있습니까?
Lists.transform()
하지만
Lists.filter()
?
목록을 선택 필터링합니까? 나는 사용할 수 있습니다
new ArrayList(Collection2.filter())
물론,하지만 이렇게하면 내가 이해한다면 주문이 동일하게 유지되고 보장되지 않습니다.
반환 된 목록보기에 #get (index)와 같은 위험한 많은 수의 느린 메소드가 노출되기 때문에 구현되지 않았습니다 (성능 버그 초대). 그리고 ListIterator는 구현하기에도 고통 스러울 것입니다 ( 몇 년 전에 패치를 출시했지만 ).
인덱싱 된 메소드는 필터링 된 목록보기에서 처음 일 수 없기 때문에 필터링 된 Iterable을 사용하지 않는 것이 좋습니다.
당신 Iterables.filter
은 확실히 순서를 사용할 수 있습니다 .
새 목록을 구성 하면 요소 (물론 참조 만) 가 복사되지 않은 원본 목록에 대한 라이브 뷰 요소입니다. 보기를 만드는 것은 매우 까다로울 수 있습니다. 다음 상황을 고려하십시오.
Predicate<StringBuilder> predicate =
/* predicate returning whether the builder is empty */
List<StringBuilder> builders = Lists.newArrayList();
List<StringBuilder> view = Lists.filter(builders, predicate);
for (int i = 0; i < 10000; i++) {
builders.add(new StringBuilder());
}
builders.get(8000).append("bar");
StringBuilder firstNonEmpty = view.get(0);
그것은 모든 것에 대해 반복하여 모든 것에 적용되어야합니다. 조건 자 일치가 뷰의 수명 동안 변경되지 않도록 요구할 수 있습니다.
(이것은 단지 추측 일뿐입니다. 아마도 Guava 관리자 중 한 명이 진짜 이유를 알아낼 것입니다. :)
new List(Collection2.filter())
물론 사용할 수 있지만 이렇게하면 내 주문이 동일하게 유지된다는 보장이 없습니다.
이것은 사실이 아닙니다. Collections2.filter()
느리게 평가되는 함수입니다. 필터링 된 버전에 액세스하기 시작할 때까지 실제로 컬렉션을 필터링하지 않습니다. 예를 들어 필터링 된 버전을 반복하는 경우 필터링 된 요소는 원래 컬렉션과 동일한 순서로 반복기에서 튀어 나옵니다 (분명히 필터링 된 요소 제외).
아마도 당신은 수행하고 결과를 임의의 정렬되지 않은 컬렉션으로 만들 생각하고 있었을 것입니다.
따라서 원래의 Collections2.filter()
입력으로 사용하면 이 유지됩니다.
정적 가져 오기 오기 (및 Lists.newArrayList
함수)를 사용하면 상당히 간결 해집니다.
List filteredList = newArrayList(filter(originalList, predicate));
이 있습니다 반면 Collections2.filter
열망으로 반복 기본 콜렉션, 않을하지 Lists.newArrayList
것이다 는 필터링 콜렉션의 모든 요소를 추출하고 그들에게 새로운에 복사 - ArrayList
.
존이 언급했듯이 Iterables.filter(..)
또는 를 사용할 수 Collections2.filter(..)
있으며 라이브 뷰가 필요하지 않은 경우 ImmutableList.copyOf(Iterables.filter(..))
또는 를 사용할 수 Lists.newArrayList( Iterables.filter(..))
있으며 예 주문이 유지됩니다. 왜 부분에
관심이 있다면 https://github.com/google/guava/issues/505 에서 자세한 내용을 확인할 수 있습니다 .
다른 사람들이 말한 것을 요약하면 목록을 필터링하는 일반 래퍼를 쉽게 만들 수 있습니다.
public static <T> List<T> filter(Iterable<T> userLists, Predicate<T> predicate) {
return Lists.newArrayList(Iterables.filter(userLists, predicate));
}
참고 URL : https://stackoverflow.com/questions/8458663/guava-why-is-there-no-lists-filter-function
'IT' 카테고리의 다른 글
DPI 설정 (예 : 150 %)이 높은 컴퓨터에서 실행 실행 앱을 구성하는 방법은 무엇입니까? (0) | 2020.09.14 |
---|---|
nextTick 대 setImmediate, 설명 설명 (0) | 2020.09.14 |
설치에 존재하지 않는 경우에만 고용주 파일 생성 (0) | 2020.09.14 |
== PHP에서 대소 문자 식별 비교입니까? (0) | 2020.09.14 |
여러 JavaScript 파일을 하나의 JS 파일로 결합 (0) | 2020.09.14 |