2011-01-26 6 views
7

가정하자 나는처럼 보이는 개체가 :의 ArrayList에서 객체의 속성 목록을 얻는 방법

public class Obj { 
String foo; 
String bar; 
} 

I 유형 확대 개체의 ArrayList를을 만들고 그것을 채울 수 있다면,이 목록을 반환 할 수있는 방법이 배열의 foo 속성에있는 ArrayList의 모든 객체는?

편집 : 좀 더 명확해야, 나는 목록을 반복

+0

을 : 아래

는 제네릭을 사용하지 않는 아파치 컬렉션의 적은 형태 보증 된 버전 버전 < 4이다 obj에서 모든 Obj 중? – Ralph

답변

7

List<String> foos = new ArrayList<String>(); 
for (Obj obj : objs) { 
    foos.add(obj.foo) 
} 

또는 Java 8 이후

는 사용하여 스트림이 같은

objs.stream().map(o -> o.foo).collect(toList()); 
+3

제 첫 번째 버전은 다음과 같습니다 :'var foos = objs.Select (x => x.foo);'나는 자바 문제라는 것을 알게되었습니다. 빌어 먹을'LINQ' 세상에! –

+0

Guava와 같은 것을 사용하여 일반 자바에서'map'에 해당하는 것을 할 수 있습니다. 분명히 더 많은 작업이 포함되지만 원래 목록에있는 모든 foo 값의 복사본에 메모리를 할당하는 것보다 이점이 있습니다. – ColinD

+1

Java 8 Lambda가 이에 대한 새로운 영리성을 제공합니까? Ala the scala-LINQ 속임수. – ken

0

으로 반복을 통해이 작업을 수행하고 모든 foo는 속성 집합을 만들고 싶지 않았다.

당신은 당신의 List<Obj>을 반복하고 새로운 List

예에 foo는 항목을 대조해야합니다

0

뭔가를?

List<String> foos = new ArrayList<String>(); 
for (Obj obj : objList) 
{ 
    foos.addElement(obj.foo); 
} 
4

이 같은 Lists.transform 사용하여 List에있는 개체의 foo 재산의보기를 만들 수 Guava 사용 : 다른 솔루션과는 달리

public class Obj { 
    String foo; 
    String bar; 

    public static final Function<Obj, String> FOO = new Function<Obj, String>() { 
    public String apply(Obj input) { 
     return input.foo; 
    } 
    }; 
} 

public void someMethod(List<Obj> objs) { 
    List<String> foos = Lists.transform(objs, Obj.FOO); 
    ... 
} 

을, 이것은 순전히 List<Obj>보기이다 따라서 전체적으로 ArrayList 또는 그 중 일부를 메모리에 할당하지 않으며 List<Obj>의 크기에 관계없이 거의 시간 내에 생성 할 수 있습니다. 또한 원래 List<Obj>을 변경하면 foos 목록에 해당 변경 사항이 반영됩니다.

Java 8 (언젠가 2012 년 예정)에서는 람다 식과 메소드 참조가 훨씬 쉬울 것입니다. 당신이 뭔가를 할 수 있습니다 :

List<Obj> objs = ... 
List<String> foos = objs.map(#Obj.getFoo); 
10

이 시도 :

Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName")); 

사용 아파치 평민 모음 API를.

+0

감사합니다.이 방법은 간단하고 신속합니다. – Vito

1

@Surodip의 대답은 Apache Commons Collections을 기반으로 한 간결한 솔루션을 사용합니다. 그러나 Transfomer 문자열 표현을 통해 속성을 참조하기 때문에이 솔루션은, 형태 보증되지 않습니다 : TransformerUtils.invokerTransformer("getName") 여기

좀 더 자세한이지만, 아파치 코 몬즈 컬렉션을 사용하여 형태 보증 된 솔루션 :

Collection<String> values = CollectionUtils.collect(messages, new Transformer<Obj, String>(){ 

      @Override 
      public String transform(Obj input) { 
       return input.getFoo(); 
      } 

     }); 

위의 솔루션은 아파치 코 몬즈를 사용 컬렉션 버전> = 4, 유형 안전을위한 제네릭을 지원합니다.당신은 목록 OBJS을 가지고 푸 속성을 포함하는 목록 에서 두 번째 목록을 만들려면

Collection values = CollectionUtils.collect(messages, new Transformer(){ 

      @Override 
      public Object transform(Object input) { 
       Obj obj = (Obj) input; 
       return obj.getFoo(); 
      } 

     }); 
관련 문제