2016-03-14 13 views
8

Ho bisogno di implementare un metodo che restituisca un "Seq", in Java Ma ho riscontrato un errore, non so come risolverlo.Convertire la lista Java in Scala Seq

java.util.ArrayList cannot be cast to scala.collection.Seq 

Ecco il mio codice finora

@Override 
public Seq<String> columnNames() { 
    List<String> a = new ArrayList<String>(); 
    a.add("john"); 
    a.add("mary"); 
    Seq<String> b = (scala.collection.Seq<String>) a; 
    return b; 
} 

scala.collection.JavaConverters. non sembra offrire la possibilità di convertire come Seq. Grazie

+7

Eventuali duplicati di [Conversione di una collezione di Java in una collezione Scala] (http://stackoverflow.com/questions/674713/converting-a-java-collection-into -a-scala-collection) –

+1

Stai cercando problemi se provi a fare qualcosa con le collezioni Scala in Java. Scrivi un po 'di codice Scala che esegue la conversione utilizzando scala.collection.JavaConverters. –

+0

@TzachZohar la maggior parte della risposta è fatta scala. Il mio codice è Java, fa parte di un vasto programma, non riesco a esternalizzare questo trattamento ... – Fundhor

risposta

13

JavaConverters è ciò di cui avevo bisogno per risolvere questo problema.

import scala.collection.JavaConverters; 

public Seq<String> convertListToSeqTest() { 
    List<String> a = new ArrayList<String>(); 
    a.add("john"); 
    a.add("mary"); 
    return JavaConverters.asScalaIteratorConverter(a.iterator()).asScala().toSeq(); 
} 
15

JavaConversions dovrebbe funzionare. Penso che tu stia cercando qualcosa del genere: JavaConversions.asScalaBuffer(a).toSeq()

+3

'JavaConversions' è deprecato e ora dovrebbe essere scritto come' JavaConverters.asScalaBuffer (a) ' – kap

+0

_Should_ be? Nah ... Consigliato da una persona sconosciuta che pensava che fosse un'idea migliore è più simile :) – Dima

+0

Probabilmente. Ho appena seguito il suggerimento nell'API di Scala. Non conosco nessuna delle persone che stava scrivendo e/o deprecandolo ;-) – kap

4

@Fundhor, il metodo asScalaIterableConverter non veniva visualizzato nell'IDE. Potrebbe essere dovuto a una differenza nelle versioni di Scala. Sto usando Scala 2.11. Invece, ha mostrato asScalaIteratorConverter. Ho apportato una leggera modifica al tuo ultimo frammento e ha funzionato bene per me.

scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq() dove columnNames è un java.util.List.

grazie!

2

Fino a 4 elementi, si può semplicemente utilizzare il metodo factory della classe Seq in questo modo:

Seq<String> seq1 = new Set.Set1<>("s1").toSeq(); 
Seq<String> seq2 = new Set.Set2<>("s1", "s2").toSeq(); 
Seq<String> seq3 = new Set.Set3<>("s1", "s2", "s3").toSeq(); 
Seq<String> seq4 = new Set.Set4<>("s1", "s2", "s3", "s4").toSeq(); 
2

Questo ha funzionato per me! (Java 8, Spark 2.0.0)

import java.util.ArrayList; 

import scala.collection.JavaConverters; 
import scala.collection.Seq; 

public class Java2Scala 
{ 

    public Seq<String> getSeqString(ArrayList<String> list) 
     { 
      return JavaConverters.asScalaIterableConverter(list).asScala().toSeq(); 
     } 

} 
Problemi correlati