Kotlin与Java语法对比学习

定义变量

// Kotlin
val i: Int = 10  // 定义一个整数变量
val d: Double = 10.0  // 定义一个双精度浮点数变量
val b: Boolean = true  // 定义一个布尔变量
val c: Char = 'a'  // 定义一个字符变量
val s: String = "Hello, World!"  // 定义一个字符串变量
val arr: Array<Int> = arrayOf(1, 2, 3)  // 定义一个整数数组
val ui: UInt = 10u  // 定义一个无符号整数变量
// Java
int i = 10;  // 定义一个整数变量
double d = 10.0;  // 定义一个双精度浮点数变量
boolean b = true;  // 定义一个布尔变量
char c = 'a';  // 定义一个字符变量
String s = "Hello, World!";  // 定义一个字符串变量
int[] arr = {1, 2, 3};  // 定义一个整数数组
// java不支持无符号整数变量

类型检测

// Kotlin
if (obj is String) { val str = obj as String }  // 类型检测与类型转换
// Java
if (obj instanceof String) { String str = (String) obj; }  // 类型检测与类型转换

控制流

// Kotlin
val max = if (a > b) a else b  // 条件表达式
when (x) { 1 -> print("x == 1") else -> print("x != 1") }  // when表达式,类似于Java的switch
for (item in collection) println(item)  // for循环
while (x > 0) x--  // while循环
// Java
int max = (a > b) ? a : b;  // 条件表达式
switch (x) { case 1: System.out.println("x == 1"); break; default: System.out.println("x != 1"); }  // switch语句
for (Object item : collection) System.out.println(item);  // for-each循环
while (x > 0) x--;  // while循环

// Kotlin 
for (i in 1..10) { if (i == 5) break }  // 使用break跳出循环
for (i in 1..10) { if (i % 2 == 0) continue; println(i) }  // 使用continue跳过当前迭代
// Java
for (int i = 1; i <= 10; i++) { if (i == 5) break; }  // 使用break跳出循环
for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; System.out.println(i); }  // 使用continue跳过当前迭代

异常

// Kotlin
try { /*...*/ } catch (e: SomeException) { /*...*/ } finally { /*...*/ }  // 异常处理
throw SomeException()  // 抛出异常
// Java
try { /*...*/ } catch (SomeException e) { /*...*/ } finally { /*...*/ }  // 异常处理
throw new SomeException();  // 抛出异常

导包

// Kotlin
package com.example.myapp  // 定义包
import kotlin.text.*  // 导入包
// Java
package com.example.myapp;  // 定义包
import java.util.*;  // 导入包

类相关

// Kotlin
class MyClass { var x = 5 }  // 定义一个类
open class Base { /*...*/ }  // 定义一个可以被继承的类
class Derived : Base() { /*...*/ }  // 定义一个继承自Base的类
interface MyInterface { /*...*/ }  // 定义一个接口
fun interface Runnable { fun run() }  // 定义一个函数式接口
val runnable = Runnable { println("Running") }  // 创建一个函数式接口的实例
public var x = 5  // 定义一个公有变量
private fun foo() { /*...*/ }  // 定义一个私有函数
// Java
class MyClass { int x = 5; }  // 定义一个类
class Base { /*...*/ }  // 定义一个可以被继承的类
class Derived extends Base { /*...*/ }  // 定义一个继承自Base的类
interface MyInterface { /*...*/ }  // 定义一个接口
@FunctionalInterface interface Runnable { void run(); }  // 定义一个函数式接口
Runnable runnable = () -> System.out.println("Running");  // 创建一个函数式接口的实例
public int x = 5;  // 定义一个公有变量
private void foo() { /*...*/ }  // 定义一个私有函数

扩展函数和扩展属性

// Kotlin
fun String.lastChar(): Char = this[this.length - 1]  // 定义一个扩展函数
val <T> List<T>.lastIndex: Int get() = size - 1  // 定义一个扩展属性
// Java
// 没有

数据类

// Kotlin
data class User(val name: String, val age: Int)  // 定义一个数据类
// Java
// 没有,用Lombok可以实现

密封类

// Kotlin
sealed class Expr  // 定义一个密封类
data class Const(val number: Double) : Expr()  // 定义一个继承自Expr的数据类
data class Sum(val e1: Expr, val e2: Expr) : Expr()  // 定义一个继承自Expr的数据类
// Java
// 没有

接口、泛型

// Kotlin
interface List<out E> : Collection<E>  // 定义一个带有协变类型参数的接口
fun <T> MutableList<T>.swap(index1: Int, index2: Int)  // 定义一个泛型函数
fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T>  // 定义一个接受lambda表达式参数的泛型函数
fun <T> List<T>.binarySearch(element: T, fromIndex: Int = 0, toIndex: Int = size, comparator: Comparator<in T>? = null): Int where T : Comparable<T>  // 定义一个带有约束的泛型函数
// Java
interface List<E> extends Collection<E> { /*...*/ }  // 定义一个带有类型参数的接口
<T> void swap(List<T> list, int i, int j)  // 定义一个泛型函数
<T> List<T> customFilter(List<T> list, Predicate<T> predicate)  // 定义一个接受函数式接口参数的泛型函数
<T extends Comparable<T>> int binarySearch(List<? extends T> list, T key)  // 定义一个带有约束的泛型函数

嵌套类、内部类

// Kotlin
class Outer { class Nested { /*...*/ } }  // 定义一个嵌套类
class Outer { inner class Inner { /*...*/ } }  // 定义一个内部类
// Java
class Outer { static class Nested { /*...*/ } }  // 定义一个静态嵌套类
class Outer { class Inner { /*...*/ } }  // 定义一个内部类

枚举类

// Kotlin
enum class Direction { NORTH, SOUTH, EAST, WEST }  // 定义一个枚举类
// Java
enum Direction { NORTH, SOUTH, EAST, WEST; }  // 定义一个枚举类

内联类

// Kotlin
inline class Password(val value: String)  // 定义一个内联类
// Java
// 没有

匿名内部类、单例

// Kotlin
val listener = object : MouseAdapter() { /*...*/ }  // 创建一个匿名内部类的实例
object Singleton { /*...*/ }  // 定义一个单例
// Java
// 没有用匿名内部类和单例模式实现

委托

// Kotlin
class Derived(b: Base) : Base by b  // 类委托
class Example { var p: String by Delegate() }  // 属性委托
// Java
// 没有

别名

// Kotlin
typealias NodeSet = Set<Network.Node>  // 类型别名
typealias FileTable<K> = MutableMap<K, MutableList<File>>  // 类型别名
// Java
// 没有

函数和lambda

// Kotlin
fun add(a: Int, b: Int): Int { return a + b }  // 定义一个函数
fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T>  // 定义一个接受lambda表达式参数的泛型函数
// Java
int add(int a, int b) { return a + b; }  // 定义一个函数
<T> List<T> customFilter(List<T> list, Predicate<T> predicate)  // 定义一个接受函数式接口参数的泛型函数
// Kotlin
val sum = { x: Int, y: Int -> x + y }  // 定义一个lambda表达式
// Java
BinaryOperator<Integer> sum = (x, y) -> x + y;  // 定义一个lambda表达式
// Kotlin
inline fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T>  // 定义一个内联函数
// Java
// 没有

重载操作符

// Kotlin
operator fun BigInteger.plus(other: BigInteger): BigInteger  // 定义一个重载操作符的函数
// Java
// 没有

类型安全的构建器

// Kotlin
html { body { p { +"Hello, World!" } } }  // 使用类型安全的构建器创建一个HTML文档
// Java
// 没有,用建造者模式实现

null

// Kotlin
var a: String? = null  // 定义一个可空类型的变量
a?.length  // 安全调用操作符
// Java
String a = null;  // 定义一个可以为null的变量
int length = (a != null) ? a.length() : null;  // 使用条件表达式进行空安全的调用

相等判断

// Kotlin
a == b  // 结构相等性
a === b  // 引用相等性
// Java
a.equals(b)  // 结构相等性
a == b  // 引用相等性

this表达式

// Kotlin
class A { fun foo() { println(this) } }  // this表达式
class A { inner class B { fun foo() { println(this@A) } } }  // 使用限定的this表达式
// Java
class A { void foo() { System.out.println(this); } }  // this表达式
class A { class B { void foo() { System.out.println(A.this); } } }  // 使用外部类的this表达式

协程

// Kotlin
fun main() = runBlocking { /*...*/ }  // 使用协程进行异步编程
// Java
// 没有协程用其他异步方式可以实现

注解

// Kotlin
@Target(AnnotationTarget.CLASS) annotation class Fancy  // 定义一个注解
// Java
@Target(ElementType.TYPE) @interface Fancy { }  // 定义一个注解

解构

// Kotlin
val (name, age) = person  // 解构声明
// Java
// 没有

反射

// Kotlin
val c = MyClass::class  // 反射
// Java
Class c = MyClass.class;  // 反射

这只是Kotlin和Java的一部分代码示例,更多的语法元素和细节,你可以在Kotlin官方文档和Java官方文档中找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL查看数据库对象大小

PostgreSQL查看数据库对象大小 PostgreSQL查看数据库对象大小1、查看某个数据库大小2、查看多个数据库大小3、按顺序查看索引大小4、查看所有对象的大小 PostgreSQL查看数据库对象大小 1、查看某个数据库大小 select pg_size_pretty(pg_database_size(tzqdb));2、查看多个数据…

【已解决】VS报错C2760

在项目中增加第三方库的时候&#xff0c;出现了C2760的报错&#xff0c;常用路径都设置好了&#xff0c;判断可能是属性设置的问题&#xff0c;就查了一下&#xff0c;确实一下就改好了 操作流程&#xff1a; 项目右键后打开最下面的属性 属性——》C/C——》语言——》符合…

数据库触发器简介——修改数据的触发器、删除数据的触发器

1.修改数据的触发器 修改数据的触发器 create trigger tb_user_update_triggerafter update on tb_user for each row begininsert int user_logs(id,operation,operate_time,operate_id,operate_params)VALUES(null,update,now(),new.id,concat(更新之前的数据&#xff1a;i…

如何设置Axure中文版 Mac系统下axurerp10怎么设置成中文

有许多小伙伴肯定想知道axure rp 10怎么转换为中文版&#xff0c;接下来就为大家带来最详细的汉化教程&#xff0c;大家可以根据教程一步一步操作&#xff0c;保证可以汉化成功&#xff01; 准备工作 安装好axurerp10 axurerp10汉化包 百度网盘链接: 百度网盘 请输入提取码 …

2023牛客暑期多校训练营2(D/E/F/H/I/K)

目录 D.The Game of Eating E.Square F.Link with Chess Game H.0 and 1 in BIT I.Link with Gomoku K.Box D.The Game of Eating 思路&#xff1a;倒着贪心。因为正着贪会导致一种局面&#xff1a;我选了当前喜爱值最大的菜&#xff0c;但是就算我不选这个菜&#xff0…

PostgreSQL实战-数据库迁移部署

PostgreSQL实战-数据库迁移部署 介绍 根据项目需求&#xff0c;我们需要将现有的PostgreSQL数据库重新部署到新的服务器上。由于项目本身就是基于PostgreSQL数据库构建的&#xff0c;因此数据库迁移将变得十分便捷。接下来&#xff0c;我将简要介绍我们的迁移步骤。 迁移步骤…

halcon线扫描相机平面交点检测--

目录 代码示例代码示例的逐句解释 以下是halcon中的代码示例 * This example shows the inspection of planar intersections of * 3D objects. The intersections are derived by intersecting the * reconstructed 3D object models with suitable planes, using the * o…

2.1 色彩空间

色彩发送器 色彩认知&#xff1a;光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。但是人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。由此把产生的新号传入大脑&#xff0c;最终大脑对颜色产生了认知感知。 光的…

如何把爱好变成事业?

如何把爱好变成事业&#xff1f; 目录 引言爱好与事业的关系如何把爱好变成事业 研究市场需求建立专业技能制定计划与目标 追求爱好的「变现」的利与弊 利&#xff1a;工作的乐趣与激情弊&#xff1a;压力与挑战 如何平衡爱好与事业 分清爱好与事业的界限建立时间管理和优先级…

数据结构-时间空间复杂度

目录 前言 1.什么是数据结构 2.什么是算法 3.数据结构和算法的重要性 1.算法的时间复杂度和空间复杂度 1.1算法效率 1.1.1如何衡量一个算法的好坏 1.1.2算法的复杂度 1.2时间复杂度 1.2.1时间复杂度的概念 1.2.2大O的渐进表示法 2.编程练习 2.1.1 排序遍历 2.1.2 2.1.3 单身狗解…

第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)

string基本概念 string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别 1、char是一个指针 2、string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char型的容器。 特点&#xff1a; string类内部封装了很多成员方…

[JAVAee]wait方法与sleep方法的区别

①最明显的一个区别是,wait方法需要搭配synchronized关键字进行使用.而sleep方法的使用不需要 ②wait是一个Object类的方法,sleep是Thread类的一个静态方法 方法说明 public static void sleep(long millis) throws interruptedException 使当前正在执行的线程以指定的毫秒数…

PostMan+Jmeter工具介绍及安装

目录 一、PostMan介绍​编辑 二、下载安装 三、Postman与Jmeter的区别 一、开发语言区别&#xff1a; 二、使用范围区别&#xff1a; 三、使用区别&#xff1a; 四、Jmeter安装 附一个详细的Jmeter按照新手使用教程&#xff0c;感谢作者&#xff0c;亲测有效。 五、Jme…

windows无盘启动技术开发之使用本地镜像文件启动电脑

by fanxiushu 2023-07-26 转载或引用请注明原始作者。 其实使用本地镜像文件启动电脑&#xff0c;这个windows操作系统本身就是自带的功能。 win7以上的系统&#xff0c;制作 vhd或vhdx格式的镜像文件&#xff0c; 然后在镜像文件中安装windows操作系统&#xff0c;然后放到真实…

【数据结构】树状数组和线段树

树状数组和线段树 下文为自己的题解总结&#xff0c;参考其他题解写成&#xff0c;取其精华&#xff0c;做以笔记&#xff0c;如有描述不清楚或者错误麻烦指正&#xff0c;不胜感激&#xff0c;不喜勿喷&#xff01; 树状数组 需求&#xff1a; 能够快速计算区间和保证在修改…

fastadmin采坑之接口分页处理

其实不算fastadmin的代码而是thinkphp自带的分页代码 paginate函数就是自带的分页函数&#xff0c;开始我以为这个只能用于渲染模板不能用于接口&#xff0c;后面看到源代码发现请求参数带page就可以 /*** ApiTitle (获取协会会员)* ApiSummary (获取协会会员)* ApiMethod …

Langchain 的 Routerchain

Langchain 的 Routerchain 1. destination_chains2. LLMRouterChain3. EmbeddingRouterChain 本笔记本演示了如何使用 RouterChain 范例创建一个链&#xff0c;该链动态选择用于给定输入的下一个链。 路由器链由两个组件组成&#xff1a; RouterChain 本身&#xff08;负责选…

React 基础篇(二)

&#x1f4bb; React 基础篇&#xff08;二&#xff09;&#x1f3e0;专栏&#xff1a;React &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…

微服务SpringCloud教程——微服务是什么

微服务&#xff08;MicroServices&#xff09;最初是由 Martin Fowler 于 2014 年发表的论文《MicroServices》中提出的名词&#xff0c;它一经提出就成为了技术圈的热门话题。 微服务&#xff0c;我们可以从字面上去理解&#xff0c;即“微小的服务”&#xff0c;下面我们从“…

excel 生成sql技巧

"update 表名 set 字段名"&A2&" where 字段名"&B2&";"