集合中的Scala.Long和Java.lang.Long之间的隐式转换(Implicit conversion between Scala.Long and Java.lang.Long in collections)
我正在使用JavaConverters从Java SortedSet转到Vector。
val lines = function.getInstructions.asScala.toVector
我的getInstructions函数返回一个java.lang.Long的ArrayList,但消费代码需要Scala.Long。 有没有办法做到这一点,而不需要改变我的所有使用Java.lang.Long的代码?
此外,有没有办法隐式转换为一个值类,以允许随机访问ArrayList而无需像上面那样分配额外的对象? 非常感谢您提供的任何见解。
I'm using JavaConverters to go from a Java SortedSet to a Vector.
val lines = function.getInstructions.asScala.toVector
My getInstructions function returns an ArrayList of java.lang.Long, yet the consuming code requires Scala.Long. Is there a way to do this without changing all of my consuming code to use Java.lang.Long?
Furthermore, is there a way to do an implicit conversion to a value class to allow random access to the ArrayList without allocating an extra object as above? Thanks a ton for any insight you might provide.
原文:https://stackoverflow.com/questions/24620574
更新时间:2020-01-12 17:12
最满意答案
Scala有自动装箱功能,很多时候scala.Long是java.lang.Long 。 当值存储在像Vector这样的集合中时,情况几乎总是如此。 目前,做一个.asInstanceOf[Vector[scala.Long]]来转换Vector的类型是安全的,但这可能会在将来改变 。
一种更安全的方法是显式转换值。 Scala具有scala.Long和java.lang.Long之间的隐式转换,但它们不会转换这些类型的集合。 但是,您可以将它们与map进行转换,例如.map(Long2long)将java.lang.Long的集合转换为scala.Long的集合。
至于你的第二个问题,如果你导入scala.collection.JavaConversions._而不是JavaConverters你将得到一组隐式转换。 不过,推荐的方法是使用JavaConverters 。 在你的情况下,它也会更有效率,因为包装器只需要创建一次。
如果你真的喜欢快速而危险的玩法,你可以编写自己的隐式转换:
implicit def convArrayList(al: ArrayList[java.lang.Long]): Vector[Long] =
al.asScala.map(Long2long)(collection.breakOut)
Scala has autoboxing, so much of the time a scala.Long is a java.lang.Long. This is almost always the case when the value is stored inside a collection like Vector. At present it is safe to do a .asInstanceOf[Vector[scala.Long]] to convert the type of the Vector, but this could change in the future.
A safer way is to explicitly convert the values. Scala has implicit conversions between scala.Long and java.lang.Long, but they won't convert collections of those types. However, you can combine them with map to convert, e.g. .map(Long2long) to convert a collection of java.lang.Long to a collection of scala.Long.
As for your second question, if you import scala.collection.JavaConversions._ instead of JavaConverters you will get a set of implicit conversions. However, the recommended way is it to use JavaConverters. It would also be more efficient in your case, because the wrapper only has to be created once.
If you really like to play fast and dangerous, you could write your own implicit conversion:
implicit def convArrayList(al: ArrayList[java.lang.Long]): Vector[Long] =
al.asScala.map(Long2long)(collection.breakOut)
2014-07-08
相关问答
正如Kon所说,你只需要将整数转换为字符串。 在DB2 SQL中,您可以这样做: select * from tcotet A where cast(A.icont as char(12)) like '%7187%'
注意(奇怪的是),整数不能转换为varchar,因此需要使用char类型。 As Kon said, you just need to cast the integer to a string. In DB2 SQL, you whould do it like this: se
...
他们说要尝试JavaConverters,因为JavaConversions已被弃用。 scala> import collection.JavaConverters._
import collection.JavaConverters._
scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =
| (new java.util.HashMap[A, B] /: (for (m
...
hibernate Session.delete(Object object)不会按ID删除,而是需要Entity的实例。 只需更改DAO方法以接受对象本身或实例化要删除的新对象。 public void deleteUserTicketEntity(UserTicketEntity ticket) {
// delete passed in object
this.sessionFactory.getCurrentSession().delete(ticket);
}
publ
...
import scala.collection.JavaConverters._
// given a Java List of Java Longs:
val jlist: java.util.List[java.lang.Long] = ???
val scalaList: List[Long] = jlist.asScala.toList.map(_.toLong)
import scala.collection.JavaConverters._
// given a Java Li
...
您无法更改 Long值。 它一成不变。 检查这个以及更多信息 You can not change Long value. Its immutable. Check this and that for more info
我决定从实际的角度回答你的问题。 我使用以下简单的JMH基准测试来测试原始scala集合的每秒操作并转换一次(使用隐式转换)。 请查看下面的基准代码: import org.openjdk.jmh.annotations._
import scala.collection.JavaConversions._
@State(Scope.Thread)
class WrapperBenchmark {
val unwrappedCollection = (1 to 100).toSet
...
使用BigInteger#longValue()方法,而不是将其转换为Long : return firstResult.get(0).longValue();
看起来像firstResult.get(0)返回一个Object 。 一种选择是对BigInteger进行类型转换: return ((BigInteger)firstResult.get(0)).longValue();
但不要这样做。 而应使用Nambari在评论中提供的方式。 我不是Hibernate的用户,所以我不能提供Hib
...
Scala有自动装箱功能,很多时候scala.Long是java.lang.Long 。 当值存储在像Vector这样的集合中时,情况几乎总是如此。 目前,做一个.asInstanceOf[Vector[scala.Long]]来转换Vector的类型是安全的,但这可能会在将来改变 。 一种更安全的方法是显式转换值。 Scala具有scala.Long和java.lang.Long之间的隐式转换,但它们不会转换这些类型的集合。 但是,您可以将它们与map进行转换,例如.map(Long2long)
...
第一个对象是Long数组,第二个是Long 。 尝试这个 Long l = 1l;
Long[] l2 = {};
System.out.println(l.getClass());
System.out.println(l2.getClass());
产量 class java.lang.Long
class [Ljava.lang.Long;
但我确实同意[L_class_; 数组类型的表示非常混乱。 我想知道这是怎么回事。 The first object
...
为什么看起来它不会返回Long对象? 15.18.2。 数值类型的加法运算符(+和 - )告诉我们: 对操作数执行二进制数字提升。 数值操作数上的加法表达式的类型是其操作数的提升类型。 并且5.6.2。 二进制数字促销告诉我们: 如果任何操作数是引用类型,则进行拆箱转换。 这意味着Long + Long的结果很long ,我们不能调用基本类型的方法。 如果它不返回Long对象,我们如何能够使用Long c = a[0] + a[1] ? 对于Long c = a[0] + a[1] , long由
...