Skip to content

Commit 06983c2

Browse files
author
chenzc
committed
add chapter 2
1 parent b21376d commit 06983c2

File tree

4 files changed

+704
-4
lines changed

4 files changed

+704
-4
lines changed

2-GettingStarted/2.1-Basic_Syntax.md

Lines changed: 340 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,340 @@
1-
# 基础语法
1+
# 基础语法
2+
3+
**定义包**
4+
5+
定义包应该在源文件的最顶部。
6+
7+
```
8+
package my.demo
9+
10+
import java.util.*
11+
12+
// ...
13+
```
14+
15+
包名不需要和文件夹路径保持一致:源文件可以摆放在文件系统中的任意位置。
16+
17+
查看[详情](../3-Basics/3.2-Packages.md)
18+
19+
**定义函数**
20+
21+
包含2个`Int`类型的参数,并返回`Int`类型值的函数:
22+
23+
```
24+
fun sum(a: Int, b: Int): Int {
25+
return a + b
26+
}
27+
```
28+
29+
包含表达式表示返回值类型的函数:
30+
31+
```
32+
fun sum(a: Int, b: Int) = a + b
33+
```
34+
35+
返回无意义返回值的函数:
36+
37+
```
38+
fun printSum(a: Int, b: Int): Unit {
39+
println("sum of $a and $b is ${a + b}")
40+
}
41+
```
42+
43+
省略掉`Unit`类型返回值的函数:
44+
45+
```
46+
fun printSum(a: Int, b: Int) {
47+
println("sum of $a and $b is ${a + b}")
48+
}
49+
```
50+
51+
查看[详情](../5-FunctionsAndLambdas/5.1-Functions.md)
52+
53+
**定义局部变量**
54+
55+
只赋值一次的(只读的)局部变量:
56+
57+
```
58+
val a: Int = 1 // 马上赋值
59+
val b = 2 // 默认表示Int类型
60+
val c: Int // 当没有初始化时,变量需指定类型
61+
c = 3 // 延时赋值
62+
```
63+
64+
可变变量:
65+
66+
```
67+
var x = 5 // 代表了Int类型
68+
x += 1
69+
```
70+
71+
查看[详情](../4-ClassesAndObjects/4.2-Properties_and_Fields.md)
72+
73+
**注释**
74+
75+
跟Java和JavaScript类似,Kotlin也支持单行注释和块注释。
76+
77+
```
78+
// This is an end-of-line comment
79+
80+
/* This is a block comment
81+
on multiple lines. */
82+
```
83+
84+
与Java不一样的是,在Kotlin中块注释可以互相嵌套。
85+
86+
查看[生成Kotlin代码文档](../10-Tools/10.1-Documenting_Kotlin_Code.md)去获得关于文档化注释语法的信息。
87+
88+
**使用字符串模板**
89+
90+
```
91+
var a = 1
92+
// 在模板中的变量名:
93+
val s1 = "a is $a"
94+
95+
a = 2
96+
// 在模板中的任意表达式:
97+
val s2 = "${s1.replace("is", "was")}, but now is $a"
98+
```
99+
100+
[TODO]: 跳转到基本类型的字符串模板
101+
查看[详情](../3-Basics/3.1-Basic_Types.md)
102+
103+
**使用条件表达式**
104+
105+
```
106+
fun maxOf(a: Int, b: Int): Int {
107+
if (a > b) {
108+
return a
109+
} else {
110+
return b
111+
}
112+
}
113+
```
114+
115+
使用`If`表达式:
116+
117+
```
118+
fun maxOf(a: Int, b: Int) = if (a > b) a else b
119+
```
120+
121+
[TODO]: 跳转到控制流中的if表达式
122+
查看[详情](../3-Basics/3.3-Control_Flow.md)
123+
124+
**使用可为null的值和检查null**
125+
126+
一个引用可能为null值时,必须要明确表达为可能为null。
127+
如果`str`不能转换成一个整型数字,则返回null:
128+
129+
```
130+
fun parseInt(str: String): Int? {
131+
// ...
132+
}
133+
```
134+
135+
使用一个可能返回null值的函数:
136+
137+
```
138+
fun printProduct(arg1: String, arg2: String) {
139+
val x = parseInt(arg1)
140+
val y = parseInt(arg2)
141+
142+
// 在执行x * y时可能出错,是因为他们可能为null。
143+
if (x != null && y != null) {
144+
// 在经过非空检查后,x和y自动转换成非空的
145+
println(x * y)
146+
}
147+
else {
148+
println("either '$arg1' or '$arg2' is not a number")
149+
}
150+
}
151+
```
152+
153+
或者
154+
155+
```
156+
// ...
157+
if (x == null) {
158+
println("Wrong number format in arg1: '${arg1}'")
159+
return
160+
}
161+
if (y == null) {
162+
println("Wrong number format in arg2: '${arg2}'")
163+
return
164+
}
165+
166+
// 在经过非空检查后,x和y自动转换成非空的
167+
println(x * y)
168+
```
169+
170+
查看[详情](../6-Others/6.8-Null_Safety.md)
171+
172+
**使用类型检查和自动转换**
173+
174+
`is`操作符检查一个表达式是否是一个类型的实例。如果一个可变的局部变量或者属性检查是否为指定类型时,很明确没有必要去转换:
175+
176+
```
177+
fun getStringLength(obj: Any): Int? {
178+
if (obj is String) {
179+
// 在这个分支下,obj自动转换成String
180+
return obj.length
181+
}
182+
183+
// 在判断分支外,obj仍然是Any类型
184+
return null
185+
}
186+
```
187+
188+
或者
189+
190+
```
191+
fun getStringLength(obj: Any): Int? {
192+
if (obj !is String) return null
193+
194+
// 在这个分支下,obj自动转换成String
195+
return obj.length
196+
}
197+
```
198+
199+
甚至
200+
201+
```
202+
fun getStringLength(obj: Any): Int? {
203+
// 在&&操作符右侧,obj自动转换成String
204+
if (obj is String && obj.length > 0) {
205+
return obj.length
206+
}
207+
208+
return null
209+
}
210+
```
211+
212+
查看[](../4-ClassesAndObjects/4.1-Classes_and_Inheritance.md)[类型转换](../6-Others/6.4-Type_Checks_and_Casts.md)
213+
214+
**使用for循环**
215+
216+
```
217+
val items = listOf("apple", "banana", "kiwi")
218+
for (item in items) {
219+
println(item)
220+
}
221+
```
222+
223+
或者
224+
225+
```
226+
val items = listOf("apple", "banana", "kiwi")
227+
for (index in items.indices) {
228+
println("item at $index is ${items[index]}")
229+
}
230+
```
231+
232+
[TODO]: 跳转到控制流中的for循环
233+
查看[详情](../3-Basics/3.3-Control_Flow.md)
234+
235+
**使用while循环**
236+
237+
```
238+
val items = listOf("apple", "banana", "kiwi")
239+
var index = 0
240+
while (index < items.size) {
241+
println("item at $index is ${items[index]}")
242+
index++
243+
}
244+
```
245+
246+
[TODO]: 跳转到控制流中的while循环
247+
查看[详情](../3-Basics/3.3-Control_Flow.md)
248+
249+
**使用when表达式**
250+
251+
```
252+
fun describe(obj: Any): String =
253+
when (obj) {
254+
1 -> "One"
255+
"Hello" -> "Greeting"
256+
is Long -> "Long"
257+
!is String -> "Not a string"
258+
else -> "Unknown"
259+
}
260+
```
261+
262+
[TODO]: 跳转到控制流中的when表达式
263+
查看[详情](../3-Basics/3.3-Control_Flow.md)
264+
265+
**使用区间**
266+
267+
使用`in`操作符检查数值是否在已知区间内。
268+
269+
```
270+
val x = 10
271+
val y = 9
272+
if (x in 1..y+1) {
273+
println("fits in range")
274+
}
275+
```
276+
277+
检查数值不在已知区间内。
278+
279+
```
280+
val list = listOf("a", "b", "c")
281+
282+
if (-1 !in 0..list.lastIndex) {
283+
println("-1 is out of range")
284+
}
285+
if (list.size !in list.indices) {
286+
println("list size is out of valid list indices range too")
287+
}
288+
```
289+
290+
迭代已知区间内的元素:
291+
292+
```
293+
for (x in 1..5) {
294+
print(x)
295+
}
296+
```
297+
298+
或者通过指定的步长进行迭代:
299+
300+
```
301+
for (x in 1..10 step 2) {
302+
print(x)
303+
}
304+
for (x in 9 downTo 0 step 3) {
305+
print(x)
306+
}
307+
```
308+
309+
查看[详情](../6-Others/6.3-Ranges.md)
310+
311+
**使用集合**
312+
313+
对集合进行迭代:
314+
315+
```
316+
for (item in items) {
317+
println(item)
318+
}
319+
```
320+
321+
使用`in`操作符检查集合中是否包含某个对象:
322+
323+
```
324+
when {
325+
"orange" in items -> println("juicy")
326+
"apple" in items -> println("apple is fine too")
327+
}
328+
```
329+
330+
使用lambda表达式过滤和映射操作集合:
331+
332+
```
333+
fruits
334+
.filter { it.startsWith("a") }
335+
.sortedBy { it }
336+
.map { it.toUpperCase() }
337+
.forEach { println(it) }
338+
```
339+
340+
查看[详情](../5-FunctionsAndLambdas/5.2-Higher-Order_Functions_and_Lambdas.md)

0 commit comments

Comments
 (0)