특정 개체 목록이 있다고 상상해보십시오.
List<Student>
그리고 위 목록 의 ids
of Students
를 포함하여 다른 목록을 생성해야 합니다.
List<Integer>
루프를 사용하지 않고 아파치 컬렉션 이나 구아바를 사용하여이를 달성 할 수 있습니까?
제 경우에 어떤 방법이 유용해야합니까?
특정 개체 목록이 있다고 상상해보십시오.
List<Student>
그리고 위 목록 의 ids
of Students
를 포함하여 다른 목록을 생성해야 합니다.
List<Integer>
루프를 사용하지 않고 아파치 컬렉션 이나 구아바를 사용하여이를 달성 할 수 있습니까?
제 경우에 어떤 방법이 유용해야합니까?
답변:
그것을하는 자바 8 방법 :-
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
Guava를 사용하면 다음과 같은 기능을 사용할 수 있습니다.
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
이 기능을 사용하여 학생 목록을 다음과 같은 ID로 변환 할 수 있습니다.
Lists.transform(studentList, StudentToId.INSTANCE);
확실히 모든 ID를 추출하기 위해 반복되지만 guava 메서드는 view를 반환하고 Function은 반복 List<Integer>
하지 않으면 반복 을 시도 할 때만 적용됩니다 .
참고 : 이것이보기라는 것을 기억하고 여러 번 반복하려는 경우 다른 List<Integer>
유사한 콘텐츠를 복사하는 것이 좋습니다.
ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
Premraj 덕분에대체 멋진 옵션에 대한 에게 .
나는 아파치 CollectionUtils와 BeanUtils를 사용했습니다. 따라서 다음 코드의 성능에 만족합니다.
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList,
new BeanToPropertyValueTransformer("id"));
위에서 사용한 guava ( Premraj 제공)와 collectionUtils 의 성능을 비교 하고 더 빠른 것을 결정할 것입니다.
Identifiable
은 getId()
방법 을 정의 하는 인터페이스를 가질 수 있으며이 단일 열거 형 단일 패턴을 사용하여 Id를 일반적으로 추출 할 수 있습니다.
자바 8 람다 표현 솔루션 :
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
루프없이이를 수행하는 것은 수학적으로 불가능합니다. 불연속 값 집합의 매핑 F를 다른 불연속 값 집합에 매핑하려면 F가 원래 집합의 각 요소에 대해 작동해야합니다. (기본적으로이를 수행하려면 루프가 필요합니다.)
즉,
새 목록이 필요한 이유는 무엇입니까? 잘못된 방식으로 해결중인 문제에 접근 할 수 있습니다.
목록이있는 Student
경우이 목록을 반복 할 때 학생의 ID 번호를 반복 할 때 한두 단계 만 남았습니다.
for(Student s : list)
{
int current_id = s.getID();
// Do something with current_id
}
다른 종류의 문제가있는 경우 질문에 댓글을 달거나 업데이트하면 도와 드리겠습니다.