Scala中Java List无法用for推导式:withFilter不是java.util.List成员
解决Java List在Scala For推导式中的
withFilter缺失问题 你遇到的错误核心原因是:Scala的for推导式依赖Scala集合框架提供的高阶方法(比如withFilter、map),而java.util.List并不属于Scala集合体系,没有实现这些方法。要解决这个问题,只需要把Java List转换成Scala兼容的集合即可。
步骤1:导入Scala-Java集合转换工具
Scala提供了官方的集合转换工具,推荐使用scala.jdk.CollectionConverters(旧版本的JavaConverters/JavaConversions已经被标记为过时),先导入这个包:
import scala.jdk.CollectionConverters._
步骤2:修改For推导式,转换Java List
在for推导式的生成器部分,调用asScala方法把java.util.List转换成Scala的mutable.Buffer(属于Scala集合体系,支持for推导式所需的所有方法):
for { bucket: Terms.Bucket <- topLevelBuckets.asScala aggResult = AggResult( bucket.getKeyAsString, bucket.getDocCount, bucket.getAggregations.get("total_usage").asInstanceOf[Sum].getValue ) } yield aggResult case class AggResult(bucketKey: String, bucketCount: Long, bucketValue: Double)
可选:优化类型转换的安全性
你的代码里使用了asInstanceOf[Sum],如果聚合不存在或者类型不匹配,会抛出ClassCastException。可以用模式匹配+Option来做更安全的处理:
for { bucket: Terms.Bucket <- topLevelBuckets.asScala totalUsageAgg <- Option(bucket.getAggregations.get("total_usage")) // 处理聚合不存在的情况 sumAgg <- totalUsageAgg match { case sum: Sum => Some(sum) // 匹配Sum类型 case _ => None // 类型不匹配时跳过当前bucket } } yield AggResult( bucket.getKeyAsString, bucket.getDocCount, sumAgg.getValue )
这样修改后,代码就可以正常将java.util.List[Terms.Bucket]转换为AggResult的Scala列表了。
内容的提问来源于stack exchange,提问作者Navin Gelot
相关产品推荐
相关产品推荐

