Преобразовать буфер Scala в Java ArrayList - PullRequest
8 голосов
/ 20 июля 2010

В своей функции Scala я обхожу коллекцию Java ArrayCollection, извлекая конкретные элементы, которые должны сформировать новую коллекцию. В конце, это снова должен быть Java-ArrayList, потому что я взаимодействую с Java Framework. Мой код:

// 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

Как я могу преобразовать Buffer в ArrayList [User]? Или я не должен использовать урожай здесь?

Ответы [ 3 ]

8 голосов
/ 20 июля 2010

Вы должны быть в состоянии преобразовать его обратно, указав, какой тип вы бы хотели 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 )
2 голосов
/ 20 июля 2010

Вы можете передать буфер в конструктор ArrayList для создания нового Java ArrayList:

var newArray = new ArrayList[Int] (buffer)
1 голос
/ 20 июля 2010

Когда используется для понимания, базовый код использует 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
...