IT

Java :지도 기능이 있습니까?

lottoking 2020. 6. 28. 18:00
반응형

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

반응형