একটি জাভা সংগ্রহকে একটি স্কালা সংগ্রহে রূপান্তর করা


88

ওভারফ্লো প্রশ্ন স্ট্যাক সম্পর্কিত সম্পর্কিত নতুন হ্যাশসেট (সংগ্রহ) এর সমতুল্য, আমি কীভাবে একটি জাভা সংগ্রহ ( java.util.Listবলি) একটি স্কালা সংগ্রহে রূপান্তর করব List?

আমি আসলে জাভা এপিআই কলটি স্প্রিংয়ে রূপান্তর করার চেষ্টা করছি SimpleJdbcTemplate, যা java.util.List<T>একটিকে স্কালকে অস্থাবরতে রূপান্তরিত করে HashSet। উদাহরণস্বরূপ:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

এটি কাজ করে বলে মনে হচ্ছে। সমালোচনা স্বাগত!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)

উত্তর:


17

আপনার শেষ পরামর্শটি কার্যকর হয় তবে আপনি এটি ব্যবহার এড়াতে পারেন jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

নোট যে scala.collection.immutable.Setডিফল্ট ধন্যবাদ উপলব্ধ উপলব্ধ করা হয় Predef.scala


9
যেখানে আমি টাইপ তথ্য রাখতে চাই সেখানে এই পরামর্শটি কার্যকর করে না
অক্সবো_লাক

127

ভবিষ্যতের রেফারেন্সের জন্য: স্কেল ২.৮ এর সাথে এটি এমনভাবে করা যেতে পারে:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

setএটি scala.collection.immutable.Set[String]পরে একটি ।

আরো দেখুন বেন জেমস 'উত্তর আরো স্পষ্ট উপায় (JavaConverters ব্যবহার করে), যা এখন বাঞ্ছনীয় হবে বলে মনে হয় না।


দেখে মনে হচ্ছে এখন কলটির প্রয়োজন নেই JavaConversionsএমন কিছু বিষয় রয়েছে toSet
রাজিশ

@Rajish আমার মনে হয় এটা ভালো যদি রূপান্তর (দেখুন স্পষ্ট হয় stackoverflow.com/questions/8301947/... )
krookedking

আপনি সঠিক হয় তার ভাল ব্যবহার করার জন্য আমদানি scala.collection.JavaConverters._
অভিষেক সেনগুপ্ত


25

জাভা কনভার্সনগুলি ( রবিনস্টের উত্তর ) এবং জাভা কনভার্টার্স ( বেন জেমস এর উত্তর ) কে স্কালা ২.১০ এর সাথে বাদ দেওয়া হয়েছে

জাভা কনভার্সনগুলির পরিবর্তে ব্যবহার করুন:

import scala.collection.convert.wrapAll._

aleksandr_hramcov দ্বারা প্রস্তাবিত হিসাবে ।

জাভা কনভার্টারের পরিবর্তে ব্যবহার করুন:

import scala.collection.convert.decorateAll._

উভয়ের ক্ষেত্রে কেবলমাত্র জাভা বা স্কালায় রূপান্তর / রূপান্তরকারীগুলি আমদানি করার সম্ভাবনা রয়েছে, যেমন:

import scala.collection.convert.wrapAsScala._

আপডেট: জাভা কনভার্সন এবং জাভা কনভার্টরসকে অবমূল্যায়িত করা হয়েছিল উপরের বিবৃতিটি ভুল বলে মনে হচ্ছে। স্কেলা ২.১০-এ কিছু অবমূল্যায়িত সম্পত্তি ছিল যার ফলস্বরূপ সেগুলি আমদানি করার সময় অবমূল্যায়ন সতর্কতা তৈরি হয়েছিল। সুতরাং এখানে বিকল্প আমদানি কেবলমাত্র এলিয়াস বলে মনে হচ্ছে। যদিও আমি এখনও তাদের পছন্দ করি, আইএমএইচও হিসাবে নামগুলি আরও উপযুক্ত।


আপনি কেন জাভা কনভার্সন এবং জাভা কনভার্টরসকে অবহেলা করা বলেছেন? বর্তমান ডকুমেন্টেশনে 2.11.8 উভয়ই অবচিত বলে চিহ্নিত করা হয়নি এবং তাদের কাছে 'ডেকোরেটএল' বা 'র্যাপল'-এর উল্লেখ নেই যে এটি নতুন এবং পছন্দসই ব্যবহার।
জুস্ট ড্যান বোয়ার

@ জুস্টডেন বোয়ের মনে হচ্ছে স্কেলা ২.১০-তে সেখানে কিছু অবহেলিত সাজসজ্জা রয়েছে , যদিও মনে হয় এগুলি আবার স্কেলা ২.১১ দিয়ে অপসারণ করা হয়েছে।
স্ট্যাম্পলার

14

আপনি এই দুর্দান্ত গ্রন্থাগারটিও ঘুরে দেখতে চাইতে পারেন: স্কালজ-সংগ্রহ যা জাভা এবং স্কালা সংগ্রহগুলির মধ্যে দ্বি-মুখী রূপান্তর রয়েছে। আপনার ক্ষেত্রে, java.util.List কে স্কালা তালিকায় রূপান্তর করতে আপনি এটি করতে পারেন:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala

4
সেই গ্রন্থাগারটি সর্বকালের সর্বশ্রেষ্ঠ জিনিস। সত্যিই ভাল কাজ করে।
মাইকেল নিল

7
কয়েক বছর পরে এটি আবার ঘুরে দেখা যায়, স্কালার জাভা কনভার্টারগুলি যাওয়ার উপায়।
সূর্য সুরভরপু

5

শুরু Scala 2.13, প্যাকেজ scala.jdk.CollectionConvertersপ্যাকেজগুলি প্রতিস্থাপন করে scala.collection.JavaConverters/JavaConversions._:

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")

3
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

এটি একটি দুর্দান্ত উত্তর এবং আমার সমস্যার সমাধান। ইন্টারনেটে উল্লিখিত বেশিরভাগ পদ্ধতি কেবল (উদাহরণস্বরূপ) java.util.List [java.lang.Long] কে scala.collection.immutable.List [java.lang.Long] এ রূপান্তর করে। সুতরাং এই পদ্ধতিটি এটিকে আমারে scala.collection.immutable.List [scala.Long]
আজকাল

2

সেটটি প্যারামিটারাইজড করার জন্য আপনি ট্যারি অ্যারে টাইপের তথ্য যুক্ত করতে পারেন:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

সংগ্রহ প্যাকেজটি স্কেলা ২.৮ এর জন্য একটি বড় পুনর্নির্মাণের মধ্য দিয়ে চলেছে এবং স্কালাকলোকলশন.জেসিএল প্যাকেজটি দূরে চলে যাওয়ার কারণে এটি পছন্দনীয় হতে পারে might


1

আপনি জাভা সংগ্রহটি একটি অ্যারেতে রূপান্তর করতে পারেন এবং তারপরে একটি স্কালা তালিকা তৈরি করতে পারেন:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

4
এটি দুর্দান্ত নয় কারণ আমার java.util.List একটি জাভা API থেকে প্যারামিট্রাইজড তালিকা হিসাবে ফিরে আসছে (সুতরাং আমার এপিআইতে কলটি java.util.List <স্ট্রিং> উপস্থাপন করবে) - আমি এটি চালু করার চেষ্টা করছি
স্কেলে

1

এই সমস্যাটি সমাধানের আর একটি সহজ উপায়:

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