2016-07-12 4 views
5

Мне нужно преобразовать параметр Scala в Java Необязательно. Мне удалось это написать:Преобразование опции Scala в Java Необязательно

public <T> Optional<T> convertOption2Optional(Option<T> option) { 
    return option.isDefined() ? Optional.of(option.get()) : Optional.empty(); 
} 

Но мне оно не нравится.

Есть ли простой способ сделать это или встроенный конвертер scala? Я ищу что-то вроде:

Options.asJava(option); 
+0

Почему бы вам просто не создать статический метод 'asJava (опция opt)' в самостоятельном классе 'Options'? –

+0

Я мог бы, но это еще один кусок кода для поддержки, я бы хотел использовать «стандартный способ» – mjjaniec

ответ

8

Самый короткий путь я могу думать в Java является:

Optional.ofNullable(option.getOrElse(null)) 

@ RégisJean-Жиль фактически предложил еще короче, если вы пишете преобразование в Scala :

Optional.ofNullable(option.orNull) 

Кстати, вы должны знать, что Scala не поддерживает Java 8 до Scala 2.12, которая не является официально пока вне. Рассматривая docs (который может измениться до выпуска), такого преобразования в JavaConversions нет.

+0

Конечно, вот почему я не смог его найти :) – mjjaniec

+0

Просто примечание, не рекомендуется использовать 'JavaConversions' вообще. 'JavaConverters' является предпочтительным способом. В любом случае ни один из них не поддерживает «Факультативный» в то время, когда – dk14

+0

@ dk14 рекомендован кем и почему? Насколько я могу судить, они делают то же самое с немного другим синтаксисом. 'JavaConverters', возможно, обеспечивает хороший синтаксис, но это будет работать только от кода Scala, а не от кода Java, пытающегося конвертировать коллекции Scala, поскольку Java не поддерживает implicits. Нет ничего плохого в 'JavaConversions' – Dici

0

Я делаю это:

import java.util.{Optional => JOption} 

package object myscala { 

    implicit final class RichJOption[T](val optional: JOption[T]) { 

     def asScala: Option[T] = optional match { 
      case null => null 
      case _ => if (optional.isPresent) Option(optional.get()) else None 
     } 

    } 

    implicit final class RichOption[T](val option: Option[T]) { 

     def asJava: JOption[T] = option match { 
      case null => null 
      case _ => if (option.isDefined) JOption.of(option.get) else JOption.empty() 
     } 

    } 
} 

так, вы может использовать его следующим образом:

import myscala._ 

object Main extends App { 

    val scalaOption = java.util.Optional.ofNullable("test").asScala 
    println(scalaOption) 

    val javaOption = Option("test").asJava 
    println(javaOption) 

} 
0

Для данного входного параметра opt: Option[T] некоторого класса, вы можете определить метод внутри этого класса, как следующее:

def toOptional(implicit ev: Null <:< T): Optional[T] = Optional.ofNullable(opt.orNull).

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