두 개의 문자열 속성이 포함 된 개체 목록이 있습니다.guava - 반복문 반복 반복 방지
public class A {
public String a;
public String b;
}
나는 두 Sets
재산 a
을 포함하는 하나 하나 b
검색하려는.
순진 접근 방법은 무엇인가 긴이 라인이다 : 나는이 방법으로 결국 구아바의 기능적인 방법으로 일을하려고
List<A> list = ....
Set<String> listofa = new HashSet<>();
Set<String> listofb = new HashSet<>();
for (A item : list) {
if (item.a != null)
listofa.add(item.a);
if (item.b != null)
listofb.add(item.b);
}
: 나는 두 번 반복 할 것
Function<String,A> getAFromList = new Function<>() {
@Nullable
@Override
public String apply(@Nullable A input) {
return input.a;
}
};
Function<String,A> getBFromList = Function<>() {
@Nullable
@Override
public String apply(@Nullable A input) {
return input.b;
}
};
FluentIterable<A> iterables = FluentIterable.from(list);
Set<String> listofAs = ImmutableSet.copyOf(iterables.transform(getAFromList).filter(Predicates.notNull()));
Set<String> listofBs = ImmutableSet.copyOf(iterables.transform(getBFromList).filter(Predicates.notNull()));
그러나이 방법 목록에.
두 번 또는 여러 번 반복하는 것을 피하는 방법이 있습니까?
일반적으로 (guava/java뿐만 아니라) 일반적인 사용 방법으로 이러한 유스 케이스를 어떻게 해결할 수 있습니까?
음. 나는 따라갈 수 있는지 잘 모르겠다. 'Lists '를 사용할 때 이것이 어떻게 다른가요? 나는 여전히 초기 목록을 두 번 반복해야한다. 느리게 소비 된보기 만있는 경우에도이 두 목록의 항목에 액세스하면 Sets와 동일한 방식으로 목록을 두 번 반복해야합니다. 또는 나는 무엇인가 놓치고 있냐? –
아니요, 맞습니다. 뷰를 통한 초기화는 O (1)이지만 O (N)에있는 요소에 반복적으로 액세스하면 초기화됩니다. 이 전략은 항상 하나 또는 두 컬렉션을 반복하지 않는 경우에만 잘 작동합니다. –