Будьте очень осторожны с 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()
вот метод карты.Он использует ту же функцию <> «обратные вызовы», что и Collections.transform()
.Список, который вы получаете, доступен только для чтения, используйте copyInto()
, чтобы получить список для чтения и записи.
В противном случае, конечно, когда java8 выйдет с лямбдами, это будет устаревшим.