একটি জাভা 8 পদ্ধতিতে একটি স্কালা ফাংশন পাস করা


18

নিম্নলিখিত স্কালা কোডটি কাজ করে এবং কোনও ফাংশন প্রত্যাশা করে জাভা পদ্ধতিতে দেওয়া যেতে পারে। এটি করার একটি ক্লিনার উপায় আছে? এখানে আমার প্রথম পাস:

val plusOne = new java.util.function.Function[Int,Int] {
  override def apply(t:Int):Int = t + 1

  override def andThen[V](after:function.Function[_ >: Int, _ <: V]):
    function.Function[Int, V] = ???

  override def compose[V](before:function.Function[_ >: V, _ <: Int]):
    function.Function[V, Int] = ???
}

এখানে আমার দ্বিতীয় পাসটি - এটি স্কালা সিনট্যাক্সটিকে আরও সহজ করতে জাভা -8 ফাংশন ইন্টারফেসের জন্য জেনেরিক মোড়ক ব্যবহার করে:

// Note: Function1 is Scala's functional interface,
// Function (without the 1) is Java 8's.
case class JavaFunction1[U,V](f:Function1[U,V]) extends Function[U,V] {
  override def apply(t: U): V = f(t)
  override def compose[T](before:Function[_ >: T, _ <: U]):
    Function[T, V] = ???
  override def andThen[W](after:Function[_ >: V, _ <: W]):
    Function[U, W] = ???
}

val plusOne = JavaFunction1((x:Int) => x + 1)
val minusOne = JavaFunction1((x:Int) => x - 1)

আমরা কি আরও ভাল করতে পারি?

ফলো-আপ হিসাবে, জাভা 8 এর প্রথম-শ্রেণীর ফাংশন অ্যাপ্লিকেশনটির জন্য স্কালা কোনও দিন ইনভোক-ডাইনামিক অপ-কোড ব্যবহার করবে এমন কোনও সুযোগ আছে কি? এটি কি সবকিছুকে যাদুকরীভাবে কাজ করবে বা এখনও সেখানে সিনট্যাকটিক রূপান্তর হওয়া দরকার?

উত্তর:


10

আপনি রূপান্তর অন্তর্ভুক্ত করতে পারেন:

implicit def toJavaFunction[U, V](f:Function1[U,V]): Function[U, V] = new Function[U, V] {
  override def apply(t: U): V = f(t)

  override def compose[T](before:Function[_ >: T, _ <: U]):
    Function[T, V] = toJavaFunction(f.compose(x => before.apply(x)))

  override def andThen[W](after:Function[_ >: V, _ <: W]):
    Function[U, W] = toJavaFunction(f.andThen(x => after.apply(x)))
}

implicit def fromJavaFunction[U, V](f:Function[U,V]): Function1[U, V] = f.apply

আপনার আসলে ওভাররাইড করার দরকার নেই composeএবং andThen, তবে স্কালা সংকলক জাভা 8 ডিফল্ট ইন্টারফেস পদ্ধতিগুলি সম্পর্কে এখনও জানেন না। (সম্পাদনা: এটি 2.10.3 এ কাজ করা উচিত।)

এছাড়াও, আপনি স্কালাল ল্যাম্বডাস (অর্থাত্ x => ...) Functionএবং স্কাল 2.11 এ এবং অন্য কোনও এসএএম টাইপ এবং জাভা 8 ল্যাম্বডাস নির্ধারণ করতে সক্ষম হবেন Function1। (সম্পাদনা: এটি আসলে স্কেল ২.১২ এ যোগ হয়েছে, ২.১১ নয়।)


you should be able to assign Scala lambdas- এর অর্থ এই যে, স্কালাল 2.11 এ, একটি স্কালা ফাংশনটি জাভা 8 লাম্বডায় আর্গুমেন্ট হিসাবে পাস হতে পারে?
কেভিন মেরেডিথ

এটি আর্গুমেন্ট হিসাবে পাস করা যায় কিনা ল্যাম্বদার ধরণের উপর নির্ভর করে; যদি এটি উদাহরণস্বরূপ হয় java.util.function.Consumer[scala.Function1[Integer, String]]তবে এটি 2.11 এর আগেও করা যেতে পারে।
আলেক্সি রোমানভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.