Вопрос

Мне нужен Карта функция.Есть ли что-то подобное уже в Java?

(Для тех, кто задается вопросом:Я, конечно, знаю, как реализовать эту тривиальную функцию сам ...)

Это было полезно?

Решение

Нет понятия функции в JDK как на Java 6.

Гуава имеет Функция Интерфейс, хотя и
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 Что касается многих вещей, которые вы бы хотели, чтобы Java имел, но это не так. Опять же, есть также этот замечательный язык Scala, которая делает все, что Джава должна была сделать, но не все еще не совместима со всем, написанным для 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() вот метод map.Он использует ту же функцию<> "обратные вызовы" как Collections.transform().Список, который вы получите обратно, доступен только для чтения, используйте copyInto() чтобы получить список чтения-записи.

В противном случае, конечно, когда java8 выйдет с лямбдами, это устареет.

Это еще одна функциональная lib, с которой вы можете использовать карту: http://code.google.com/p/totallyLazy/

sequence(1, 2).map(toString); // lazily returns "1", "2"

Хотя это старый вопрос, который я хотел бы показать другое решение:

Просто определите свою собственную работу, используя дженерики Java и потоки Java 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top