Java :지도 기능이 있습니까?
지도 기능이 필요 합니다. Java에 이미 이와 같은 것이 있습니까?
(궁금한 사람들을 위해 : 물론이 사소한 기능을 직접 구현하는 방법을 알고 있습니다 ...)
Java 6에서 JDK에는 함수에 대한 개념이 없습니다.
구아바 에는 기능 인터페이스가 있지만이 방법은 필요한 기능을 제공합니다.
Collections2.transform(Collection<E>, Function<E,E2>)
예:
// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
Collections2.transform(input, new Function<Integer, String>(){
@Override
public String apply(final Integer input){
return Integer.toHexString(input.intValue());
}
});
System.out.println(output);
산출:
[a, 14, 1e, 28, 32]
요즘 Java 8에는 실제로지도 기능이 있으므로 코드를보다 간결하게 작성합니다.
Collection<String> hex = input.stream()
.map(Integer::toHexString)
.collect(Collectors::toList);
Java 8부터 JDK에서이를 수행하기위한 몇 가지 표준 옵션이 있습니다.
Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());
참조 java.util.Collection.stream()
및 java.util.stream.Collectors.toList()
.
Java가 갖고 싶어하는 많은 것들을 처리하는 Functional Java 라는 훌륭한 라이브러리 가 있지만 그렇지 않습니다. 그런 다음 Java에서해야 할 모든 작업을 수행하지만 JVM 용으로 작성된 내용과 여전히 호환되지 않는이 멋진 언어 Scala도 있습니다.
Collections2.transform()
구아바를 조심하십시오 . 이 방법의 가장 큰 장점은 게으름이라는 가장 큰 위험입니다.
의 문서 Lists.transform()
를 참조하십시오 Collections2.transform()
.
이 함수는 느리게 적용되며 필요할 때 호출됩니다. 이것은 돌려 주어진리스트가 뷰가되기 위해서 필요 합니다만, 이것은 List.contains (java.lang.Object) 및 List.hashCode ()와 같은 대량 조작에 함수가 여러번 적용되는 것을 의미합니다. 이것이 잘 수행 되려면 기능이 빨라야합니다. 반환 된 목록을 볼 필요가 없을 때 지연 평가를 피하려면 반환 된 목록을 선택한 새 목록에 복사하십시오.
또한 문서 Collections2.transform()
에서 라이브 뷰를 얻는다고 언급했는데 소스 목록의 변경 사항은 변환 된 목록에 영향을 미칩니다. 개발자가 작동 방식을 모르는 경우 이런 종류의 동작으로 인해 추적하기 어려운 문제가 발생할 수 있습니다.
더 고전적인 "지도"를 원한다면 한 번만 실행 FluentIterable
되며 구아바에서도 훨씬 더 간단한 작업을 수행하는 것이 좋습니다. 여기 구글 예제가있다 :
FluentIterable
.from(database.getClientList())
.filter(activeInLastMonth())
.transform(Functions.toStringFunction())
.limit(10)
.toList();
transform()
지도 방법은 다음과 같습니다. 와 동일한 Function <> "콜백"을 사용 Collections.transform()
합니다. 당신이 얻는 목록은 읽기 전용이지만 copyInto()
읽기-쓰기 목록을 얻는 데 사용 하십시오.
그렇지 않으면 물론 java8이 람다와 함께 나올 때 이것은 쓸모가 없습니다.
이것은 당신이지도를 사용할 수있는 또 다른 기능적 라이브러리입니다 : http://code.google.com/p/totallylazy/
sequence(1, 2).map(toString); // lazily returns "1", "2"
오래된 질문이지만 다른 해결책을 제시하고 싶습니다.
자바 제네릭과 자바 8 스트림을 사용하여 자신의 작업을 정의하십시오.
public static <S, T> List<T> mapAll(Collection<S> collection, Function<S, T> mapper) {
return collection.stream().map(mapper).collect(Collectors.toList());
}
다음과 같은 코드를 작성할 수있는 것보다 :
List<String> hex = mapAll(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
참고URL : https://stackoverflow.com/questions/3907394/java-is-there-a-map-function
'IT' 카테고리의 다른 글
git clone --mirror를 업데이트하는 방법? (0) | 2020.06.28 |
---|---|
자바 문자열을 Date 객체로 변환하는 방법 (0) | 2020.06.28 |
객체 지향 분석 및 설계를 사용하여 엘리베이터 모델링 (0) | 2020.06.28 |
업로드 된 이미지, SQL 데이터베이스 또는 디스크 파일 시스템을 저장하기에 가장 좋은 장소는 무엇입니까? (0) | 2020.06.28 |
바이트 슬라이스를 io.Reader로 변환 (0) | 2020.06.28 |