В моей функции Scala я пересекаю Java ArrayCollection, извлекая определенные элементы, которые должны сформировать новый набор. В конце это должен быть Java-ArrayList снова, потому что я взаимодействую с Платформой Java. Мой Код:
// to make scala-style iterating over arraylist possible
import scala.collection.JavaConversions._
// ArrayList contains elements of this type:
class Subscription(val subscriber:User, val sender:User)
// I'm getting this list from Java:
val jArrayList = new ArrayList[Subscription]
// Buffer:scala.collection.mutable.Buffer[User]
val buffer = for (val subscription <- jArrayList ) yield subscription.sender
Как я могу преобразовать Буфер в ArrayList [Пользователь]? Или разве я не должен использовать урожай здесь?
Вы должны быть в состоянии преобразовать его обратно, указав, какой тип вы хотите buffer
(JavaConversions
должны быть введены в игру автоматически, когда тип, который вы пытаетесь получить, и тот, который у вас есть, несовместимы):
val buffer: java.util.List[User] =
for (val subscription <- jArrayList ) yield subscription.sender
Или же вы можете вызвать преобразование из JavaConversions
явно, если хотите, чтобы было понятно, что вы делаете:
val buffer = asList( for ( ... ) ) // buffer should have type "java.util.List[User]"
Ни один из этих методов не производит ArrayList
; скорее, они создают общий List
, но, как правило, указывать типы коллекций напрямую - плохая практика. Если вам необходимо иметь ArrayList
, передайте ваш List
в конструктор ArrayList
, который принимает Collection
:
new ArrayList( buffer )
Когда используется понимание, в основном коде используются map
, flatMap
, foreach
, filter
или withFilter
-- см. связанные вопросы. В данном конкретном примере этот код будет эквивалентен jArrayList.map(_.sender)
, а map
создает новые коллекции (я игнорирую неявное преобразование здесь для простоты).
Что здесь происходит, что, возможно, неинтуитивно и может быть улучшено, так это то, что ArrayList
не реализует map
. Неявное преобразование дает Buffer
, а map
на Buffer
возвращает Buffer
.
Разумеется, Buffer
на JavaConversions
сохраняет базовую коллекцию, ArrayList
, в качестве резервного хранилища. Вновь созданный Buffer
, с другой стороны, будет основан не на нем, а на одной из собственных коллекций Scala.
Однако вы всегда можете сделать так:
val buffer = (for (val subscription <- jArrayList ) yield subscription.sender).asList
Вы можете передать буфер в конструктор ArrayList, чтобы создать новый java ArrayList:
var newArray = new ArrayList[Int] (buffer)