জাভা তালিকা থেকে স্কালা তালিকা কীভাবে পাবেন?


133

আমার কাছে একটি জাভা এপিআই রয়েছে যা এই তালিকার মতো করে:

public List<?> getByXPath(String xpathExpr)

আমি নীচের স্কাল কোডটি ব্যবহার করছি:

val lst = node.getByXPath(xpath)

এখন আমি যদি স্ক্যাল সিনট্যাক্স চিনির মতো চেষ্টা করি:

lst.foreach{ node => ... }

এটা কাজ করে না. আমি ত্রুটি পেয়েছি:

value foreach is not a member of java.util.List[?0]

মনে হচ্ছে আমার জাভা তালিকাটি স্কালার তালিকায় রূপান্তর করা দরকার। উপরের প্রসঙ্গে তা কীভাবে করবেন?



@ কিম: আমি নিশ্চিত নই যে এটিকে সেই নির্দিষ্ট প্রশ্নের সদৃশ হিসাবে বন্ধ করা উপযুক্ত - সেই বিশেষ প্রশ্নটি স্কেলা ২.7 সম্পর্কে আলোচনা করে, এবং স্কালা.কলোলেশন.জেসিএল প্যাকেজটি স্কেলা ২.৮ এবং ২.৯ এ আর বিদ্যমান নেই।
কেন ব্লুম

উত্তর:


177

সম্পাদনা: নোট করুন যে এটি ২.১২.০.০ এর থেকে অবচিত করা হয়েছে। JavaConvertersপরিবর্তে ব্যবহার করুন। (@ ইয়ারোস্লাভ দ্বারা মন্তব্য)

স্কেল ২.৮ যেহেতু এই রূপান্তরটি এখন ব্যবহার করে ভাষায় নির্মিত হয়েছে:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

কাজ করে। asScalaএটা কাজ করছে না


13
২.১০.৪-এ আমাকে স্কেল কোডলিকেশনটি আমদানি করতে হয়েছিল ava জাভা কনভার্টার্স__ নইলে আমি পেয়েছি "ভ্যালু অ্যাসস্কালা জাভা.ইটিল এর সদস্য নয়। তালিকা [স্ট্রিং]"
ড্র্যাঙ্কো

11
JavaConversions২.১২.০ থেকে অবহিত করা হয়েছে। JavaConvertersপরিবর্তে ব্যবহার করুন।
ইয়ারোস্লাভ

4
2.13.x এর জন্য আপনার স্কেলা- import scala.jdk.CollectionConverters._ lang.org/api/2.13.x/scala/jdk/ClayConverters$.html
নিকোলাস

92

কেবলমাত্র এর জন্য একটি সুবিধাজনক স্কেলা অবজেক্ট রয়েছে - scala.collection.JavaConverters

আপনি আমদানি করতে পারেন এবং asScalaপরে নিম্নলিখিত হিসাবে:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

এটি আপনাকে স্কালার Bufferপ্রতিনিধিত্ব করে যা আপনাকে সম্পাদন করতে দেয় foreach


7
জাভা কনভার্টসগুলিকে জাভা কনভার্সনগুলির চেয়ে বেশি পছন্দ করা উচিত কারণ এটি রূপান্তরটি সুস্পষ্ট করে তোলে (এবং দুর্ঘটনাক্রমে রূপান্তরকারীগুলি এড়ানো যায়)। (অর্থাৎ এটি সঠিক উত্তর)
চিহ্নিত করুন

স্কেল ২.১13 থেকে এই শ্রেণিটিও হ্রাস করা হয়েছে। পরিবর্তে স্কেলা.জেডক.কলেকশন রূপান্তরকারী ব্যবহার করুন।
dev-null

9

আমি জাভাতে লেখা একটি উত্তর খুঁজছিলাম এবং আশ্চর্যরকমভাবে এখানে কোনও পরিষ্কার সমাধান খুঁজে পেল না। কিছুক্ষণ পরে আমি এটি অনুধাবন করতে সক্ষম হয়েছি তাই অন্য কেউ জাভা বাস্তবায়ন খুঁজছে এমন ক্ষেত্রে আমি এটি এখানে যুক্ত করার সিদ্ধান্ত নিয়েছি (আমার ধারণা এটি স্কালায়ও কাজ করে?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

আপনার যদি List<ClassA>জাভাটিকে স্কালায় রূপান্তর করতে হয় List[ClassB], তবে আপনাকে অবশ্যই নিম্নলিখিতগুলি করতে হবে:

1) অ্যাড

import scala.collection.JavaConverters._

2) ব্যবহারের পদ্ধতি asScala, toListএবং তারপরmap

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) প্যারামিটার হিসাবে ClassBপ্রাপ্ত কনস্ট্রাক্টরের সাথে নিম্নলিখিতগুলি যুক্ত করুন ClassA:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}

6

যেহেতু স্কেলা ২.৮.১ এস্কালা JavaConverters._ এবং জাভা পদ্ধতি ব্যবহার করে স্কালা এবং জাভা সংগ্রহগুলিকে রূপান্তর করতে ব্যবহার করে।

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

রূপান্তর সম্পর্ক স্কেল ডক সাইট দেখুন


6

জাভা তালিকাটিকে স্কালার তালিকায় রূপান্তর করতে শর্টকাট

import scala.collection.JavaConverters._

myjavaList.asScala.toList

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