Scala类对象列表顺序未知时如何按类名选择调用打印方法
Scala 随机顺序类实例选择打印解决方案
核心修改逻辑
- 输入调整:将原有的索引输入改为直接输入类名字符串(A/B/C),不依赖列表排序规则
- 实例匹配:通过集合的
collectFirst方法结合类型模式匹配,从任意顺序的列表中筛选对应类型的实例 - 冗余代码清理:删除
prtClass方法中无意义的重复实例创建逻辑
完整可运行代码
object printClass { class A{ val a:List[Int] = List(1,2,3,4) def printA(): Unit ={ println("Class A") println(a) } } class B{ val b:List[String] = List("Adam","Ali","Sara","Yara") def printB(): Unit ={ println("Class B") println(b) } } class C{ val c:List[Char] = List('A','S','C','E') def printC(): Unit ={ println("Class C") println(c) } } def prtClass(ch:Any): Unit ={ ch match { case a: A => a.printA() case b: B => b.printB() case c: C => c.printC() case _ => print("Class not found") } } def main(args: Array[String]): Unit = { val a = new A() val b = new B() val c = new C() // 列表顺序可随意调整,不影响后续选择逻辑 val listOfObjects = List(c,a,b) println("Choose the class to print (A,B,C) : ") val choice: String = scala.io.StdIn.readLine().trim // 根据输入的类名匹配对应类型的实例 val targetInstanceOpt = choice match { case "A" => listOfObjects.collectFirst { case instance: A => instance } case "B" => listOfObjects.collectFirst { case instance: B => instance } case "C" => listOfObjects.collectFirst { case instance: C => instance } case _ => None } targetInstanceOpt match { case Some(instance) => prtClass(instance) case None => println("Class not found") } } }
关键逻辑说明
collectFirst方法会遍历列表,返回第一个匹配模式的元素,不管列表的排序如何,只要列表中存在对应类型的实例就能正确匹配- 如果需要支持匹配列表中所有同类型的实例,可将
collectFirst替换为collect,得到所有匹配实例的列表后遍历调用打印方法即可
内容的提问来源于stack exchange,提问作者Mohammed Hamdoon
相关产品推荐
相关产品推荐

