[java] 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 용으로 작성된 것과 호환되지 않는이 멋진 언어 스칼라가 있습니다.


답변

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);


답변