如何将提供的两段Java示例代码转换为等效可运行的Scala实现
Java 转 Scala 实现代码与说明
一、组合概念示例(Book/Library/GFG 主程序)
以下代码和原Java逻辑、运行输出完全一致,演示类组合的设计模式:
// 导入原代码使用的Java集合类,保证行为完全匹配 import java.util.{ArrayList, List} // 导入JDK集合转换工具,支持Scala语法遍历Java集合 import scala.jdk.CollectionConverters._ // Book类:构造参数加val直接生成public只读成员,和原Java public成员访问逻辑一致 class Book(val title: String, val author: String) // Library类:books为私有不可变成员,和原Java private final修饰逻辑一致 class Library(private val books: List[Book]) { // 对应原Java的馆藏列表获取方法 def getListOfBooksInLibrary(): List[Book] = books } // 单例对象作为程序入口,对应原Java的GFG主类 object GFG { def main(args: Array[String]): Unit = { // 实例化3本图书对象 val b1 = new Book("EffectiveJ Java", "Joshua Bloch") val b2 = new Book("Thinking in Java", "Bruce Eckel") val b3 = new Book("Java: The Complete Reference", "Herbert Schildt") // 创建ArrayList存储书籍 val bookStore: List[Book] = new ArrayList[Book]() bookStore.add(b1) bookStore.add(b2) bookStore.add(b3) // 实例化图书馆对象 val library = new Library(bookStore) // 获取馆藏书籍列表 val books = library.getListOfBooksInLibrary() // 遍历打印书籍信息,输出内容和原Java完全一致 for (bk <- books.asScala) { println(s"Title : ${bk.title} and Author : ${bk.author}") } } }
二、基础类示例(Subject/Student 类转换)
以下代码和原Java类结构、访问权限、初始化逻辑完全一致:
// Subject类,完全匹配原Java私有属性+set/get方法的实现 class Subject { // 私有可变成员,_占位符对应引用类型默认初始值null,和原Java默认初始化逻辑一致 private var name: String = _ def setName(name: String): Unit = { this.name = name } def getName(): String = name } // Student类,持有长度为10的Subject类型私有数组,和原Java逻辑一致 class Student { private val studyAreas: Array[Subject] = new Array[Subject](10) // 其余Student类逻辑可在此扩展 }
三、核心转换规则说明
- 类与构造器:Scala支持主构造器直接定义在类名后,构造参数前加
val会生成公开只读成员,加var会生成公开可读写成员,加private修饰则为私有成员,无需像Java一样单独声明成员变量再在构造器中赋值。 - 程序入口:Scala没有静态成员概念,可运行程序的
main入口方法需要定义在object(单例对象)中,参数类型为Array[String],返回值Unit对应Java的void类型。 - 变量声明:不可变变量(对应Java
final修饰的变量)用val声明,可变变量用var声明,声明时可省略类型,Scala会自动做类型推断。 - 集合兼容:可以直接导入
java.util包下的Java集合类使用,行为和Java完全一致;如果要用Scala for表达式遍历Java集合,导入scala.jdk.CollectionConverters._后调用.asScala方法即可转换。 - Getter/Setter实现:如果类成员声明为
var,Scala会自动生成公开的get/set方法;如果需要和JavaBean规范完全对齐的方法名,也可以像示例中一样手动编写setXxx/getXxx方法,逻辑和Java无差异。 - 数组操作:Scala的
Array[类型]和Java数组的行为、性能完全一致,初始化语法为new Array[类型](数组长度)。
内容的提问来源于stack exchange,提问作者Mastery mind
相关产品推荐
相关产品推荐

