Преобразуйте буфер Scala в Java ArrayList

В моей функции 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 [Пользователь]? Или разве я не должен использовать урожай здесь?

8
задан onof 28 April 2015 в 06:55
поделиться

3 ответа

Вы должны быть в состоянии преобразовать его обратно, указав, какой тип вы хотите 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 )
8
ответ дан 5 December 2019 в 15:17
поделиться

Когда используется понимание, в основном коде используются 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
1
ответ дан 5 December 2019 в 15:17
поделиться

Вы можете передать буфер в конструктор ArrayList, чтобы создать новый java ArrayList:

var newArray = new ArrayList[Int] (buffer)
2
ответ дан 5 December 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: