2013-12-03 3 views
1

객체의 ArrayList가 있다고합시다. ArrayList<user>. User 객체의 속성은 userID입니다.ArrayList 객체의 모든 값을 얻습니다.

목록을 직접 반복하고 별도의 목록에 userID를 추가하는 대신 거기에 API 호출을 사용하여 해당 개체에서 원하는 속성을 전달하고 이러한 속성 목록을 반환 할 수 있습니까? API를 통해 살펴 봤지만 아무것도 눈에 띄지 않았습니다.

Java 7 또는 <에서 해결책을 찾고 있습니다.

답변

0

Map을 사용하려는 것 같습니다.

지도는 Key, Value 쌍을 사용합니다. userID을 키로 지정하고 실제 user 개체를 값으로 지정할 수 있습니다.

You can read more here

+0

사실, 잭슨을 사용하여 json에서 객체를 매핑하는 경우에만 문제가 발생하므로 코드를 조금 더 단순하게 유지하려고합니다. – Michael

+0

해시지도보다 간단합니까? 나는 그 때 당신이 무엇을 기대하고 있는지 정말로 확신하지 못한다. 그것은 구현하기가 쉽지 않습니다. – redFIVE

+0

나는 그 요점을 놓치고 있다고 생각합니다. 잭슨은 아주 쉽게 목록을 파싱합니다. Map을 파싱하려면 코드에 복잡성이 추가됩니다. – Michael

4

당신이 사용 lambdas expressions (자바 8)을 수행 할 수 있습니다

import java.util.*; 
import java.util.function.*; 
import java.util.stream.*; 

public class Test { 
    public static void main(String args[]){ 
    List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave")); 
    List<Long> listUsersId = users.stream() 
            .map(u -> u.id) 
            .collect(Collectors.toList()); 
    System.out.println(listUsersId); 
    } 
} 

class User { 
    public long id; 
    public String name; 

    public User(long id, String name){ 
    this.id = id; 
    this.name = name; 
    } 
} 

출력 :

[1, 2, 3, 4] 

발췌문 here.


추한 솔루션을 사용하여 반사 :

public class Test { 
    public static void main (String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 
     List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave")); 
     List<Object> list = get(users,"id"); 
     System.out.println(list); 
    } 

    public static List<Object> get(List<User> l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 
     Field field = User.class.getDeclaredField(fieldName); 
     field.setAccessible(true); 
     List<Object> list = new ArrayList<>(); 
     for(User u : l){ 
      list.add(field.get(u)); 
     } 
     field.setAccessible(false); 
     return list; 
    } 
} 
class User { 
     private long id; 
     private String name; 

     public User(long id, String name){ 
     this.id = id; 
     this.name = name; 
     } 
} 

출력 :

[1, 2, 3, 4] 
+0

흥미롭게도, 불행히도 우리는 8을 돌리고 있지는 않지만 좋은 소식이오고 있습니다. Java 7 또는 < – Michael

+0

@Michael에 대한 모든 해결책이 있습니다. 그러나 한 필드의 목록을 반환 할 수있는 방법을 만들고 싶습니까? 'List get (List l, String fieldName)'과 같은 것? –

+0

@Michael 리플렉션을 사용하여 솔루션을 추가했습니다. 모든 사용자에게 필요한 속성 목록을 가져올 수 있습니다. 데이터를 수집 할 필드의 정확한 이름을 입력하기 만하면됩니다. 이 솔루션에 대해서는별로 좋아하지 않습니다. –

1

당신은 같은 결과를 가지고 구아바의 Collections2#transform 방법을 사용할 수 있습니다.

List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer>(){ 
          public Integer apply(User user) { 
            return user.getUserID(); 
          } 
         }); 

구아바는 Java 7 이하를 지원하므로 외부 라이브러리를 사용하려는 경우 위의 경우가 작동합니다.

불행하게도 다른 개체와 내부 필드에 대해 비슷한 논리를 수행해야합니다. 리플렉션 하나의 일반적인 솔루션이 아닌 단순한 솔루션입니다.

+0

드문 솔루션 ...이 트릭을 가져 주셔서 감사합니다! –

관련 문제