가정하자 나는처럼 보이는 개체가 :의 ArrayList에서 객체의 속성 목록을 얻는 방법
public class Obj {
String foo;
String bar;
}
I 유형 확대 개체의 ArrayList를을 만들고 그것을 채울 수 있다면,이 목록을 반환 할 수있는 방법이 배열의 foo 속성에있는 ArrayList의 모든 객체는?
편집 : 좀 더 명확해야, 나는 목록을 반복
가정하자 나는처럼 보이는 개체가 :의 ArrayList에서 객체의 속성 목록을 얻는 방법
public class Obj {
String foo;
String bar;
}
I 유형 확대 개체의 ArrayList를을 만들고 그것을 채울 수 있다면,이 목록을 반환 할 수있는 방법이 배열의 foo 속성에있는 ArrayList의 모든 객체는?
편집 : 좀 더 명확해야, 나는 목록을 반복
List<String> foos = new ArrayList<String>();
for (Obj obj : objs) {
foos.add(obj.foo)
}
또는 Java 8 이후
는 사용하여 스트림이 같은objs.stream().map(o -> o.foo).collect(toList());
제 첫 번째 버전은 다음과 같습니다 :'var foos = objs.Select (x => x.foo);'나는 자바 문제라는 것을 알게되었습니다. 빌어 먹을'LINQ' 세상에! –
Guava와 같은 것을 사용하여 일반 자바에서'map'에 해당하는 것을 할 수 있습니다. 분명히 더 많은 작업이 포함되지만 원래 목록에있는 모든 foo 값의 복사본에 메모리를 할당하는 것보다 이점이 있습니다. – ColinD
Java 8 Lambda가 이에 대한 새로운 영리성을 제공합니까? Ala the scala-LINQ 속임수. – ken
으로 반복을 통해이 작업을 수행하고 모든 foo는 속성 집합을 만들고 싶지 않았다.
당신은 당신의List<Obj>
을 반복하고 새로운
List
예에 foo는 항목을 대조해야합니다
뭔가를?
List<String> foos = new ArrayList<String>();
for (Obj obj : objList)
{
foos.addElement(obj.foo);
}
이 같은 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);
이 시도 :
Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName"));
사용 아파치 평민 모음 API를.
감사합니다.이 방법은 간단하고 신속합니다. – Vito
@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, 유형 안전을위한 제네릭을 지원합니다.당신은 목록
Collection values = CollectionUtils.collect(messages, new Transformer(){
@Override
public Object transform(Object input) {
Obj obj = (Obj) input;
return obj.getFoo();
}
});
을 : 아래
는 제네릭을 사용하지 않는 아파치 컬렉션의 적은 형태 보증 된 버전 버전 < 4이다 obj에서 모든 Obj 중? – Ralph