2016-03-14 2 views
8

Мне нужно реализовать метод, возвращающий «Seq», в Java Но я столкнулся с ошибкой, я не знаю, как ее решить.Преобразование Java-списка в Scala Seq

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

Вот мой код до сих пор

@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. не кажется, предлагают возможность конвертировать как Seq. Спасибо

+7

Возможная дубликата [Преобразование коллекции Java в коллекции Scala] (http://stackoverflow.com/questions/674713/converting-a-java-collection-into -a-scala-collection) –

+1

Вы просите о проблемах, если вы попытаетесь сделать что-либо с коллекциями Scala на Java. Напишите немного кода Scala, который выполняет преобразование с помощью scala.collection.JavaConverters. –

+0

@TzachZohar большая часть ответа выполнена scala. Мой код - Java, это часть огромной программы, я не могу экстернализировать это обращение ... – Fundhor

ответ

13

JavaConverters - это то, что мне нужно для решения этой проблемы.

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 должно работать. Я думаю, вы ищете что-то вроде этого: JavaConversions.asScalaBuffer(a).toSeq()

+3

'JavaConversions' устарел и теперь он должен быть написан как' JavaConverters.asScalaBuffer (a) ' – kap

+0

_Should_ be? Nah ... Рекомендуемый кем-то неизвестным человеком, который думал, что это лучшая идея, больше нравится :) – Dima

+0

Возможно. Я просто следил за подсказкой в ​​Scala API. Я не знаю ни одного из тех, кто писал и/или осуждал это ;-) – kap

4

@Fundhor, метод asScalaIterableConverter не отображался в среде IDE. Это может быть связано с различием версий Scala. Я использую Scala 2.11. Вместо этого он появился asScalaIteratorConverter. Я немного изменил ваш окончательный фрагмент, и это сработало хорошо для меня.

scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq() где columnNames - java.util.List.

спасибо!

2

до 4-х элементов, вы можете просто использовать фабричный метод класса Seq как это:

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

Это работало для меня! (Java 8, Спарк 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(); 
     } 

} 
Смежные вопросы