지도 기능이 필요 합니다. 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);
Collections2.transform(input -> Integer.toHexString(intput.intValue())
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()
.
toList()
. 다른 유형으로 교체 :(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
그냥 대체 할 수 있습니까 doMap
?
foo::doMap
나 Foo::doMap
.
Java가 갖고 싶어하는 많은 것들을 처리하는 Functional Java 라는 훌륭한 라이브러리 가 있지만 그렇지 않습니다. 다시 말하지만 Java 가해 야 할 모든 것을 수행하지만 여전히 JVM 용으로 작성된 것과 호환되지 않는이 멋진 언어 스칼라가 있습니다.
a.map({int i => i + 42});
그들은 컴파일러를 확장 했습니까? 또는 추가 전 처리기?
Collections2.transform()
구아바를 조심하십시오 . 이 방법의 가장 큰 장점은 게으름이라는 가장 큰 위험입니다.
의 문서 Lists.transform()
를 참조하십시오 Collections2.transform()
.
이 함수는 느리게 적용되며 필요할 때 호출됩니다. 이것은 돌려 주어진리스트가 뷰가되기 위해서 필요 합니다만, 이것은 List.contains (java.lang.Object) 및 List.hashCode ()와 같은 벌크 오퍼레이션에 함수가 여러번 적용되는 것을 의미합니다. 이것이 잘 수행 되려면 기능이 빨라야합니다. 리턴 된 목록이보기 일 필요가 없을 때 지연 평가를 피하려면 리턴 된 목록을 선택한 새 목록으로 복사하십시오.
또한 문서 Collections2.transform()
에서 라이브 뷰를 얻는다고 언급했는데 소스 목록의 변경 사항은 변환 된 목록에 영향을 미칩니다. 개발자가 작동 방식을 모르는 경우 이런 종류의 동작으로 인해 추적하기 어려운 문제가 발생할 수 있습니다.
더 고전적인 "지도"를 원한다면 한 번만 실행 FluentIterable
되며 구아바에서도 훨씬 더 간단한 작업을 수행하는 것이 좋습니다. 다음은 Google 예제입니다.
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"
오래된 질문이지만 다른 해결책을 제시하고 싶습니다.
Java 제네릭과 Java 8 스트림을 사용하여 자신의 작업을 정의하십시오.
public static <S, T> List<T> map(Collection<S> collection, Function<S, T> mapFunction) {
return collection.stream().map(mapFunction).collect(Collectors.toList());
}
다음과 같은 코드를 작성할 수있는 것보다 :
List<String> hex = map(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);