একটি স্কালাকে কীভাবে রূপান্তর করবেন? একটি জাভা.ইটিল.লিস্টে তালিকাবদ্ধ করুন?


উত্তর:


69

স্কালার তালিকা এবং জাভা তালিকা দুটি পৃথক জন্তু, কারণ পূর্ববর্তীটি অপরিবর্তনীয় এবং পরেরটি পরিবর্তনীয়। সুতরাং, অন্য থেকে অন্য পেতে, আপনাকে প্রথমে স্কালাল তালিকাটি একটি পরিবর্তনীয় সংগ্রহের মধ্যে রূপান্তর করতে হবে।

স্কেল ২.7 এ:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

স্কেলা ২.৮ থেকে

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

যাইহোক, asListসেই উদাহরণে জাভা Listহিসাবে প্রত্যাশিত ধরণেরটি প্রয়োজনীয় নয় কারণ রূপান্তরটি অন্তর্নিহিত, যেমন শেষ লাইনের দ্বারা প্রদর্শিত demonst


ভাল x: java.util.List [ইন্ট] এখনও অপরিবর্তনীয়। শুধু জাভাতে x.add তে চেষ্টা করুন (কিছু) - এটি ত্রুটি ছুঁড়ে দেবে
ভিটামন


4
scala.collection.JavaConverters২.১২ থেকে
অবমানিত

২.১২.১-এর জন্য, যখন জাভা তালিকার সাথে সাথে লুপের জন্য একটি স্কালা দিয়ে পুনরুক্তি করা হবে তখন আমি জাভা কনভার্টার্স প্যাকেজে এসক্লা বাফার () এর সাথে আরও ভাল ভাগ্য পেয়েছি: স্কালা-lang.org/api/2.12.1/scala/collection/JavaConverters h। এইচটিএমএল
সারা মেসার

165

কেন এটি আগে উল্লেখ করা হয়নি তা নিশ্চিত নয় তবে আমি মনে করি যে সর্বাধিক স্বজ্ঞাত উপায়টি সরাসরি স্কালা তালিকায় জাভা কনভার্টারেরasJava সাজসজ্জার পদ্ধতিটি আহ্বান করা :

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

6
এটি আপনাকে এমন কিছু অন্তর্নিহিত যাদুবিদ্যার উপর নির্ভর করার পরিবর্তে সুস্পষ্ট হওয়াও প্রয়োজন যা কিছু সময় অযাচিত হতে পারে।
কামিল লেলোনেক

জাভা কোডে পরবর্তী ব্যবহারের জন্য তালিকাটি সিরিয়ালকরণ করা হলে এটি সমস্যার সৃষ্টি করে ... এর ফলাফল ক্লাসনোটফাউন্ডএক্সেপশন: scala.collection.convert.Wrappers। অ্যারে.এএসলিস্ট (ফুও: _ *) এই ক্ষেত্রে কাজ করে।
মোহন

স্ক্যালায় জাভা ব্যবহার করার সময় আমি এই পৃষ্ঠায় আসি। দুর্ভাগ্যক্রমে কোনও উপায়ই নেই যাতে আমাকে "এস.এস. জাভা" এর জন্য সঠিক আমদানির পরামর্শ দেওয়া হয় ((
মুলিয়া

24

পূর্ববর্তী উত্তরগুলি যোগ করতে

ধরে নিচ্ছি আমাদের নিম্নলিখিত রয়েছে List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

আপনি যদি সুস্পষ্ট হতে চান এবং ঠিক কী রূপান্তর করতে চান তা বলুন :

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

আপনি যদি সহ নিয়ন্ত্রণ রূপান্তর না চান এবং সংকলক আপনার জন্য অন্তর্নিহিত কাজ করতে দেয়:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

আপনি কীভাবে আপনার কোডটি নিয়ন্ত্রণ করতে চান এটি আপনার উপর নির্ভর করে।


8

শুরু Scala 2.13করার সাথে সাথে প্যাকেজটি একটি পিম্পের মাধ্যমে scala.jdk.CollectionConvertersসরবরাহ করে এবং প্যাকেজগুলি প্রতিস্থাপন করে :asJavaSeqscala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

7

বেশ পুরানো প্রশ্নগুলি, যদিও আমি উত্তর দেব, প্রদত্ত তবে বেশিরভাগ পরামর্শই হ্রাস পেয়েছে।

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters

5

হালনাগাদ

স্কেল ২.৯.২ সহ:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

ফলাফল

[1, 2, 3]

1

একক অনুরোধের জন্য, এটি হাতে হাতে করা সহজ সমাধান হতে পারে:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

আমি পারফরম্যান্স পরিমাপ করিনি।


0

উপরের প্রস্তাবিত হিসাবে কেবল কাজ করা জাভা দিক থেকেও অপরিবর্তনীয় তালিকা তৈরি করে। আমি খুঁজে পাওয়া একমাত্র কার্যকরী সমাধান হ'ল:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

0

যেহেতু স্কেলা 2.12.0 ২.১২.০ জাভা কনভার্সনগুলি করা হয়েছে।

সুতরাং আমার জন্য সহজ সমাধানটি ছিল:

java.util.Arrays.asList("a","b","c")

1
এই উত্তরটি স্ক্যাল তালিকাকে জাভা তালিকায় রূপান্তর করতে কীভাবে এটি ব্যবহার করবেন তা ব্যাখ্যা করে না। অ্যারে.এএসলিস্টটি সমস্যাযুক্তও হতে পারে কারণ এটি একটি অ্যারে প্রদান করে r অ্যারেলিস্ট যা কোনও পুনরায় আকার পরিবর্তনযোগ্য তালিকা নয় যা যদি আপনার মনে হয় যে আপনার কোনও ব্যবহার রয়েছে। অ্যারেলিস্ট।
পুহলেন

1
import scala.collection.JavaConverters._অবমূল্যায়ন সত্য, ২.১২.৪ আছে
প্রেয়াগআপড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.