├── .gitignore ├── .idea ├── libraries │ └── KotlinJavaRuntime.xml ├── misc.xml ├── modules.xml ├── uiDesigner.xml └── workspace.xml ├── README.md ├── _config.yml └── src ├── HelloKotlin.kt ├── Main.java ├── Outer.java ├── cls └── sample │ ├── HighLevelAnimal.kt │ ├── NestedClass.kt │ ├── Person.kt │ └── Student.kt ├── data └── sample │ ├── Main.kt │ └── User.kt ├── interfs └── sample │ ├── Main.kt │ ├── NewsPaper.kt │ ├── Readable.kt │ ├── Reader.kt │ └── StoryBook.kt └── obj └── sample └── Main.kt /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | /out 3 | -------------------------------------------------------------------------------- /.idea/libraries/KotlinJavaRuntime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 125 | 126 | 127 | 130 | 131 | 132 | 157 | 158 | 159 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 186 | 187 | 190 | 191 | 192 | 193 | 196 | 197 | 200 | 201 | 202 | 203 | 206 | 207 | 210 | 211 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 239 | 240 | 241 | 242 | 243 | 254 | 255 | 256 | 267 | 268 | 269 | 280 | 281 | 282 | 295 | 296 | 297 | 308 | 309 | 310 | 315 | 316 | 317 | 343 | 344 | 345 | 370 | 371 | 378 | 379 | 380 | 393 | 394 | 395 | 402 | 405 | 407 | 408 | 409 | 410 | 411 | 412 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 451 | 452 | 453 | 464 | 465 | 466 | 476 | 477 | 484 | 485 | 486 | 487 | 505 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 1495419382862 539 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 590 | 591 | 592 | 593 | 594 | 595 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 880 | 881 | 882 | 883 | 884 | 885 | No facets are configured 886 | 887 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 903 | 904 | 905 | 906 | 907 | 908 | 1.8 909 | 910 | 915 | 916 | 917 | 918 | 919 | 920 | HelloKotlin 921 | 922 | 928 | 929 | 930 | 931 | 932 | 933 | KotlinJavaRuntime 934 | 935 | 940 | 941 | 942 | 943 | 944 | 945 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Java to Kotlin 语法清单 2 | 3 |

4 |

时刻对新事物保持好奇心

5 | 6 | > Google I/O 2017 宣布在 Android Studio 3.0 将默认支持 Kotlin 用于 Android 开发. 请注意 Google 只是宣布 Kotlin 作为 Android 开发的一级语言,并没有说要用其取代 Java ,这里很多无脑媒体进行了过度解读。作为一名合格的程序员,首先要理性看待技术迭代更新,同时要对新事物保持强烈的好奇心。 7 | 8 | ## Kotlin 简介 9 | Kotlin 来自于捷克一家牛逼软件研发公司 JetBrains ,很多优秀的 IDE,如 IntelliJ IDEA、PyCharm、WebStorm 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。 10 | 11 | Kotlin 源于 JetBrains 的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛 ( Kotlin Island ) ,JetBrains 在 2010 年首次推出 Kotlin 编程语言,并在次年将之开源。 12 | 13 | ## Kotlin 的特点 14 | Kotlin 是一个基于 JVM 的编程语言,与 Java 有很深的渊源。它能与 Java 100% 互通,具备诸多 Java 尚不支持的新特性。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript ,方便在没有 JVM 的设备上运行,可用于移动端以及 Web 开发,是一种全栈式开发语言。 15 | 16 | ## Java to Kotlin 17 | 下面是 Java to Kotlin 主要语法,以便于你快速认识 Kotlin 这门语言。 18 | 19 | ### 变量 20 | **Java** 21 | ```java 22 | String lan = "Hello Kotlin"; 23 | 24 | final String lan = "Hello Kotlin"; 25 | ``` 26 | **Kotlin** 27 | ```kotlin 28 | var lan = "Hello Kotlin" 29 | 30 | val lan = "Hello Kotlin" 31 | ``` 32 | --- 33 | 34 | ### 打印字符串 35 | **Java** 36 | ```java 37 | System.out.print("Hello Kotlin"); 38 | 39 | System.out.println("Hello Kotlin"); 40 | ``` 41 | **Kotlin** 42 | ```kotlin 43 | print("Hello Kotlin"); 44 | 45 | println("Hello Kotlin"); 46 | ``` 47 | --- 48 | ### 字符串模板 49 | **Java** 50 | ```java 51 | String name = "haohao"; 52 | 53 | int age = 25; 54 | 55 | String msg = "I am " + name + ", " + age + " years old."; 56 | 57 | String text = "Hello Kotlin\n" + 58 | "Hello Android\n" + 59 | "Hello TensorFlow"; 60 | ``` 61 | **Kotlin** 62 | ```kotlin 63 | var name = "haohao"; 64 | 65 | var age = 25; 66 | 67 | var msg = "I am $name , $age years old."; 68 | 69 | var text = """ 70 | |Hello Kotlin 71 | |Hello Android 72 | |Hello TensorFlow 73 | """.trimMargin() 74 | // trimMargin() 去除连接符 `|` 75 | 76 | ``` 77 | --- 78 | ### 空声明 79 | **Java** 80 | ```java 81 | String name = null; 82 | ``` 83 | **Kotlin** 84 | ```kotlin 85 | var name: String? = null // `?` 声明变量可为 null 86 | ``` 87 | --- 88 | ### 判空 89 | **Java** 90 | ```java 91 | if (name != null) { 92 | 93 | int len = name.length; 94 | } 95 | 96 | ``` 97 | **Kotlin** 98 | ```kotlin 99 | name?.let{ 100 | 101 | val len = name.length 102 | } 103 | ``` 104 | --- 105 | ### 逻辑表达式 106 | **Java** 107 | ```java 108 | String y = x > 6 ? "x > 6" : "x <= 6"; 109 | ``` 110 | **Kotlin** 111 | ```kotlin 112 | var y = if (x > 6) 113 | "x > 6" 114 | else "x <= 6" 115 | ``` 116 | --- 117 | ### 类型判断及转换 118 | **Java** 119 | ```java 120 | if (obj instanceof Person) { 121 | 122 | Person p = (Person) obj; 123 | } 124 | ``` 125 | **Kotlin** 126 | ```kotlin 127 | if (obj is Person) { 128 | 129 | var p = obj //智能转换 130 | } 131 | ``` 132 | --- 133 | ### 区间 134 | **Java** 135 | ```java 136 | if (value >= 0 && value <= 100) { 137 | } 138 | 139 | for (int i = 1; i <= 100 ; i++) {} 140 | 141 | for (int i = 1; i < 100 ; i++) {} 142 | 143 | for (int i = 100; i >= 0 ; i--) {} 144 | 145 | for (int i = 1; i <= 100 ; i+=2) {} 146 | 147 | for (int i = 100; i >= 0 ; i-=2) {} 148 | 149 | ``` 150 | **Kotlin** 151 | ```kotlin 152 | if (value is 0..100) { 153 | } 154 | 155 | for (i in 1..100 ) {} 156 | 157 | for (i in 1 until 100) {} // 半开区间:不包含 100 158 | 159 | for (i in 100 downTo 0) {} 160 | 161 | for (i in 1..100 step 2) {} 162 | 163 | for (i in 100 donwTo 1 step 2) {} 164 | ``` 165 | --- 166 | ### list 和 map ( 针对 Java 8 之前版本 ) 167 | **Java** 168 | ```java 169 | List list = Arrays.asList(1, 2, 3, 4); 170 | 171 | for(Integer value : list) { 172 | 173 | System.out.println(value); 174 | } 175 | 176 | Map map = new HashMap<>(); 177 | 178 | map.put(1, "Java"); 179 | 180 | map.put(2, "Kotlin"); 181 | 182 | map.put(3, "iOS"); 183 | 184 | map.put(4, "React Native"); 185 | 186 | 187 | Iterator> iterator = map.entrySet().iterator(); 188 | 189 | while (iterator.hasNext()) { 190 | 191 | Map.Entry entry = iterator.next(); 192 | 193 | System.out.println(entry.getKey() + " , " + entry.getValue()); 194 | } 195 | 196 | 197 | ``` 198 | **Kotlin** 199 | ```kotlin 200 | var list = listOf(1, 2, 3, 4); 201 | 202 | list.forEach { 203 | 204 | println(it) 205 | } 206 | 207 | var map = mapOf(1 to "Java", 2 to "Kotlin", 3 to "iOS", 4 to "React Native") 208 | 209 | map.forEach { key, value -> 210 | 211 | println("$key, $value") 212 | } 213 | 214 | // 或者 215 | 216 | for ((key, value) in map) { 217 | 218 | println("$key, $value") 219 | } 220 | 221 | ``` 222 | --- 223 | ### 开关语句 224 | **Java** 225 | ```java 226 | int score = // some score 227 | String grade; 228 | switch (score) { 229 | case 10: 230 | case 9: 231 | grade = "Excellent"; 232 | break; 233 | case 8: 234 | case 7: 235 | case 6: 236 | grade = "Good"; 237 | break; 238 | case 5: 239 | case 4: 240 | grade = "Ok"; 241 | break; 242 | case 3: 243 | case 2: 244 | case 1: 245 | grade = "Fail"; 246 | break; 247 | default: 248 | grade = "Fail"; 249 | } 250 | ``` 251 | **Kotlin** 252 | ```kotlin 253 | var score = // some score 254 | var grade = when (score) { 255 | 256 | 9, 10 -> "Excellent" 257 | 258 | in 6..8 -> "Good" 259 | 260 | 4, 5 -> "Ok" 261 | 262 | in 1..3 -> "Fail" 263 | 264 | else -> "Fail" 265 | } 266 | ``` 267 | --- 268 | ### 流水线 269 | **Java** 270 | ```java 271 | List list = Arrays.asList("java", "c++", "Android", "Kotlin", "iOS"); 272 | 273 | for(int i = 0; i < list.size(); i++ ) { 274 | 275 | list.set(i, "Hello " + list.get(i)); 276 | 277 | if (!list.get(i).contains("c")) { 278 | 279 | System.out.println(list.get(i)); 280 | } 281 | } 282 | 283 | //输出: 284 | // Hello java 285 | // Hello Android 286 | // Hello Kotlin 287 | // Hello iOS 288 | ``` 289 | **Kotlin** 290 | ```kotlin 291 | var list = arrayOf("java", "c++", "Android", "Kotlin", "iOS") 292 | 293 | list.map { 294 | 295 | "Hello $it" 296 | 297 | }.filter { 298 | 299 | !it.contains("c") 300 | 301 | }.forEach { 302 | 303 | println(it) 304 | 305 | } 306 | 307 | //输出: 308 | // Hello java 309 | // Hello Android 310 | // Hello Kotlin 311 | // Hello iOS 312 | ``` 313 | --- 314 | ### 函数 315 | **Java** 316 | ```java 317 | public final void func() {} 318 | 319 | public final int func(int value) { 320 | 321 | return 1 * value; 322 | } 323 | 324 | ``` 325 | **Kotlin** 326 | ```kotlin 327 | fun func() {} 328 | 329 | fun func(value: Int): Int { 330 | 331 | return 1 * value 332 | } 333 | 334 | // 或者 335 | 336 | fun func(value: Int): Int = 1 * value 337 | ``` 338 | --- 339 | ### 类 340 | **Java** 341 | ```java 342 | public final class Person { 343 | 344 | private String name = null; 345 | 346 | private int age = 25; 347 | 348 | private Person() { 349 | } 350 | 351 | public Person(String name, int age) { 352 | 353 | this.name = name; 354 | this.age = age; 355 | } 356 | } 357 | 358 | ``` 359 | **Kotlin** 360 | ```kotlin 361 | class Person private constructor() { 362 | 363 | private var name: String? = null 364 | 365 | private var age: Int = 25 366 | 367 | constructor (name: String, age: Int): this() { 368 | 369 | this.name = name 370 | this.age = age 371 | } 372 | } 373 | ``` 374 | --- 375 | ### 静态方法( 伴生对象 ) 376 | **Java** 377 | ```java 378 | public final class Manager { 379 | 380 | private Manager() {} 381 | 382 | public static Manager getInstance () { 383 | 384 | return new Manager(); 385 | } 386 | } 387 | 388 | ``` 389 | **Kotlin** 390 | ```kotlin 391 | class Manager private constructor() { 392 | 393 | companion object { 394 | 395 | fun getInstance(): Manager = Manager() 396 | } 397 | } 398 | 399 | ``` 400 | --- 401 | ### 实体类 402 | **Java** 403 | ```java 404 | public class Person { 405 | 406 | public String name; 407 | 408 | public age; 409 | 410 | public Person(String name, int age) { 411 | 412 | this.name = name; 413 | this.age = age; 414 | } 415 | 416 | public String getName() { 417 | return name; 418 | } 419 | 420 | public void setName(String name) { 421 | this.name = name; 422 | } 423 | 424 | public int getAge() { 425 | return age; 426 | } 427 | 428 | public void setAge(int age) { 429 | this.age = age; 430 | } 431 | 432 | @Override 433 | public boolean equals(Object o) { 434 | if (this == o) return true; 435 | if (o == null || getClass() != o.getClass()) return false; 436 | 437 | Person person = (Person) o; 438 | 439 | if (age != person.age) return false; 440 | return name != null ? name.equals(person.name) : person.name == null; 441 | 442 | } 443 | 444 | @Override 445 | public int hashCode() { 446 | int result = name != null ? name.hashCode() : 0; 447 | result = 31 * result + age; 448 | return result; 449 | } 450 | 451 | @Override 452 | public String toString() { 453 | return "Person{" + 454 | "name='" + name + '\'' + 455 | ", age=" + age + 456 | '}'; 457 | } 458 | } 459 | 460 | ``` 461 | **Kotlin** 462 | ```kotlin 463 | data class Person(var name: String, var age: Int) 464 | 465 | ``` 466 | 467 | --- 468 | ### 解构 469 | **Java** 470 | ```java 471 | Person p = new Person("haohao", 25); 472 | 473 | String name = p.getName(); 474 | 475 | String age = p.getAge(); 476 | ``` 477 | **Kotlin** 478 | ```kotlin 479 | var p = Person("name", 25) 480 | 481 | var (name, age) = p 482 | ``` 483 | --- 484 | ### 接口 485 | **Java** 486 | 487 | ```java 488 | interface Readable { 489 | 490 | String getContent(); 491 | } 492 | ``` 493 | 494 | ```java 495 | public final class Book implements Readable { 496 | 497 | @override 498 | public String getContent() { 499 | 500 | return "Hello"; 501 | } 502 | } 503 | ``` 504 | **Kotlin** 505 | ```kotlin 506 | 507 | // Kotlin 接口中可以设置抽象和非抽象方法,可以有属性但必须声明为抽象或提供访问器实现。 508 | interface Readable { 509 | 510 | fun getContent(): String 511 | 512 | fun getVersion(): Int = 0 513 | 514 | } 515 | ``` 516 | 517 | ```kotlin 518 | class Book(): Readable { 519 | 520 | override fun getContent(): String = "Hello" 521 | 522 | override fun getVersion(): Int { 523 | 524 | return super.getVersion() 525 | } 526 | } 527 | ``` 528 | --- 529 | ### 继承 530 | **Java** 531 | 532 | ```java 533 | public class Person { 534 | 535 | private String name = null; 536 | 537 | public Person(String name) { 538 | this.name = name; 539 | 540 | } 541 | 542 | public void sayHello() { 543 | System.out.println("Hello"); 544 | } 545 | 546 | public final void sayGood() { 547 | System.out.println("Good"); 548 | } 549 | 550 | } 551 | ``` 552 | 553 | ```java 554 | public final class Student extends Person { 555 | 556 | private String school = null; 557 | 558 | public Student(String name, String school) { 559 | super(name); 560 | this.school = school; 561 | } 562 | 563 |    @Override 564 | public void sayHello() { 565 | super.sayHello(); 566 | System.out.println("Hello Student"); 567 | } 568 | } 569 | ``` 570 | **Kotlin** 571 | ```kotlin 572 | open class Person(private var name: String? = null) { 573 | 574 | open fun sayHello() = println("Hello") 575 | 576 | fun sayGood() = println("Good") 577 | 578 | } 579 | ``` 580 | 581 | ```kotlin 582 | class Student(private var school: String? = null, name: String): Person(name) { 583 | 584 | override fun sayHello() { 585 | super.sayHello() 586 | println("Hello Student") 587 | } 588 | 589 | } 590 | ``` 591 | --- 592 | ### 静态与非静态内部类 593 | **Java** 594 | 595 | ```java 596 | public final class Outer { 597 | 598 | private int bar = 100; 599 | 600 | public static class Nester { 601 | 602 | public final String foo() { 603 | return "Hello Kotlin!"; 604 | } 605 | } 606 | 607 | public final class Inner { 608 | 609 | public final int foo() { 610 | return bar; // 可以访问外部类成员 611 | } 612 | 613 | } 614 | 615 | } 616 | 617 | 618 | System.out.println(new Outer.Nester().foo()); 619 | 620 | // System.out.println(new Outer().Inner().foo()); 不能在其他类中实例化非静态内部类 621 | 622 | ``` 623 | 624 | **Kotlin** 625 | ```kotlin 626 | class Outer { 627 | private var bar: Int = 100 628 | 629 | // 嵌套类 630 | class Nester { 631 | // 不能访问外部类成员 632 | fun foo() = "Hello Kotlin!" 633 | } 634 | 635 | // 内部类 636 | inner class Inner { 637 | // 可以访问外部类成员 638 | fun foo() = bar 639 | } 640 | } 641 | 642 | 643 | 644 | println(Outer.Nested().foo()) 645 | 646 | println(Outer().Inner().foo()) 647 | 648 | ``` 649 | --- 650 | ### 匿名内部类 651 | **Java** 652 | ```java 653 | view.setOnClickListener(new OnClickListener() { 654 | 655 | @override 656 | onClick(View view){ 657 | // to do something. 658 | } 659 | 660 | }); 661 | ``` 662 | **Kotlin** 663 | ```kotlin 664 | interface OnClickListener { 665 | fun onClick() 666 | } 667 | 668 | class View(){ 669 | var listener: OnClickListener? = null 670 | 671 | fun setOnClickListener(listener: OnClickListener) { 672 | this.listener = listener 673 | } 674 | } 675 | 676 | view.setOnClickListener(object : OnClickListener{ 677 | override fun onClick() { 678 | TODO("not implemented") 679 | } 680 | }) 681 | 682 | ``` 683 | --- 684 | ### 扩展 685 | **Java** 686 | ```java 687 | // Java 类不能直接进行扩展 688 | ``` 689 | **Kotlin** 690 | 691 | ```kotlin 692 | // 一般扩展 693 | class MyClass { 694 | fun foo() = println("member") 695 | } 696 | 697 | fun MyClass.bar() = println("extension") 698 | 699 | MyClass().bar() 700 | 701 | //输出: extension 702 | 703 | ``` 704 | 705 | ```kotlin 706 | // 扩展函数与成员函数相同 707 | class MyClass { 708 | 709 | fun foo() = println("member") 710 | } 711 | 712 | fun MyClass.foo() = println("extension") // 扩展函数与成员函数相同时, 成员函数优先 713 | 714 | fun MyClass.foo(para: Int) = println("extension") 715 | 716 | MyClass().foo() 717 | 718 | MyClass().foo(0) 719 | 720 | //输出: 721 | // member 722 | // extension 723 | 724 | ``` 725 | --- 726 | ### Kotlin Call Java 727 | **Java** 728 | ```java 729 | public class Person { 730 | private String name = null; 731 | private int age = 0; 732 | 733 | public Person(String name, int age) { 734 | this.name = name; 735 | this.age = age; 736 | } 737 | 738 | public Person() { 739 | } 740 | 741 | public String getName() { 742 | return name; 743 | } 744 | 745 | public int getAge() { 746 | return age; 747 | } 748 | 749 | public void setName(String name) { 750 | this.name = name; 751 | } 752 | 753 | public void setAge(int age) { 754 | this.age = age; 755 | } 756 | 757 | @Override 758 | public String toString() { 759 | return "name : " + name + ", age : " + age; 760 | } 761 | } 762 | 763 | ``` 764 | **Kotlin** 765 | 766 | ```kotlin 767 | var p = Person() 768 | p.name = "haohao" 769 | p.age = 25 770 | 771 | println(p.toString()) 772 | 773 | // name : haohao, age : 25 774 | 775 | ``` 776 | --- 777 | ### Java Call Kotlin 778 | 779 | **Kotlin** 780 | 781 | ```kotlin 782 | // Example.kt 783 | package demo 784 | 785 | class MyClass 786 | 787 | fun func() { 788 | 789 | } 790 | 791 | ``` 792 | 793 | **Java** 794 | ```java 795 | new demo.MyClass(); 796 | 797 | demo.ExampleKt.func(); 798 | ``` 799 | --- 800 | ### 泛型 801 | **Java** 802 | ```java 803 | public final class Wrapper { 804 | private T item; 805 | public Wrapper(T item) { 806 | this.item = item; 807 | } 808 | 809 | public T getItem() { 810 | return item; 811 | } 812 | } 813 | 814 | Wrapper wrapper = new Wrapper<>("Hello Kotlin"); 815 | System.out.println(wrapper.getItem()); 816 | 817 | ``` 818 | **Kotlin** 819 | ```kotlin 820 | class Wrapper(val item: T) 821 | 822 | var wrapper = Wrapper("Hello Kotlin") 823 | println(wrapper.item) 824 | 825 | ``` 826 | --- 827 | ### 匿名函数 ( Lambda 表达式 ) 828 | **Java (Java 8)** 829 | ```java 830 | new Thread(() -> { 831 | 832 | System.out.println("Hello Kotlin"); 833 | 834 | }).start(); 835 | 836 | // 同下 837 | 838 | new Thread(new Runnable() { 839 | 840 | @Override 841 | public void run() { 842 | 843 | System.out.println("Hello Kotlin"); 844 | 845 | } 846 | 847 | }).start(); 848 | 849 | ``` 850 | **Kotlin** 851 | ```kotlin 852 | Thread(Runnable { 853 | 854 | println("Hello Kotlin") 855 | 856 | }).start() 857 | 858 | // Kotlin Lambda 表达式语法 859 | 860 | val sum = {x: Int, y: Int -> x + y } 861 | 862 | val sum1: (Int, Int) -> Int = {x, y -> x + y } 863 | 864 | val sum2 = fun(x: Int, y: Int): Int { 865 | return x + y 866 | } 867 | 868 | println(sum(2,8)) 869 | 870 | println(sum1(2,8)) 871 | 872 | println(sum2(2,8)) 873 | 874 | //输出: 875 | // 10 876 | // 10 877 | // 10 878 | // Hello Kotlin 879 | ``` 880 | --- 881 | ### Kotlin 高阶函数 882 | **Java** 883 | ```java 884 | // Java 不能直接实现高阶函数 885 | ``` 886 | **Kotlin** 887 | ```kotlin 888 | // 高阶函数,即一个函数可作为高阶函数的参数 889 | fun superFunc(desc: String?, method: () -> String) { 890 | print(desc) 891 | println(method()) 892 | } 893 | 894 | 895 | fun argFun() = "我是高阶函数的参数" 896 | 897 | //使用高阶函数 898 | 899 | superFunc("这是一个高阶函数 ", ::argFun) 900 | 901 | superFunc("这是一个高阶函数 ", { argFun() }) 902 | 903 | superFunc("这是一个高阶函数 ") { argFun() } 904 | 905 | 906 | //输出: 907 | //   这是一个高阶函数 我是高阶函数的参数 908 | //   这是一个高阶函数 我是高阶函数的参数 909 | // 这是一个高阶函数 我是高阶函数的参数 910 | 911 | ``` 912 | --- 913 | ### 简单异步 914 | **Java (Java 8)** 915 | ```java 916 | new Thread(() -> { 917 | 918 |    data = DataSource.obtain(); //耗时操作 919 | 920 |    runOnUiThread(() -> { 921 | 922 | view.load(data); //更新 UI 923 | 924 | }); 925 |     926 | }).start(); 927 | 928 | ``` 929 | **Kotlin (Kotlin Anko)** 930 | ```kotlin 931 | async { 932 | 933 | data = DataSource.obtain(); //耗时操作 934 | 935 | uiThread { 936 | view.load(data); //更新 UI 937 | } 938 | } 939 | ``` 940 | --- 941 | ### 泛型函数 942 | **Java** 943 | ```java 944 | // Java 不能单独实现泛型函数 945 | ``` 946 | **Kotlin** 947 | ```kotlin 948 | fun singletonList(item: T): List { 949 | return arrayListOf(item) 950 | } 951 | 952 | val list = singletonList("kotlin") 953 | ``` 954 | --- 955 | ### 嵌套函数 956 | **Java** 957 | ```java 958 | // Java 不支持嵌套函数 959 | ``` 960 | **Kotlin** 961 | ```kotlin 962 | fun main(args: Array) { 963 | 964 | fun sayHello() { 965 | println("Hello Kotlin") 966 | } 967 | 968 | sayHello(); 969 | } 970 | // 输出: 971 | // Hello Kotlin 972 | ``` 973 | --- 974 | ### Kotlin 内联具体化 975 | 976 | **Kotlin** 977 | ```kotlin 978 | inline fun Activity.gotoActivity() { 979 | 980 | val intent = Intent(this, T::class.java) 981 | this.startActivity(intent) 982 | } 983 | 984 | gotoActivity() 985 | 986 | ``` 987 | --- 988 | 989 | ### Kotlin lazy 懒加载 990 | 991 | **Kotlin** 992 | ```kotlin 993 | val lazyValue: String by lazy { 994 |    println("init") //第一次使用时才被初始化 995 |    "Hello Kotlin" 996 | } 997 | 998 | fun main(args: Array) { 999 | println(lazyValue) 1000 | println(lazyValue) 1001 | } 1002 | 1003 | //输出: 1004 | //    init 1005 | // Hello Kotlin 1006 | // Hello Kotlin 1007 | ``` 1008 | --- 1009 | 1010 | ### Kotlin observable 观察者 1011 | 1012 | **Kotlin** 1013 | ```kotlin 1014 | class Person{ 1015 | public var name: String by Delegates.observable("init .. "){ 1016 | property,oldValue,newValue -> println("property : $property, oldValue : $oldValue, newValue : $newValue") 1017 | } 1018 | } 1019 | 1020 | fun main(args: Array) { 1021 | val person = Person() 1022 | 1023 | println(person.name) 1024 | 1025 | person.name = "haohao" 1026 | person.name = "nannan" 1027 | } 1028 | 1029 | //输出: 1030 | //   init .. 1031 | //   property : var Person.name: kotlin.String, oldValue : init .. , newValue : haohao 1032 | // property : var Person.name: kotlin.String, oldValue : haohao, newValue : nannan 1033 | ``` 1034 | --- 1035 | ### Kotlin 闭包 1036 | 1037 | **Kotlin** 1038 | ```kotlin 1039 | val plus = {x: Int, y: Int -> println("$x plus $y is ${x+y}")} 1040 | 1041 | val hello = {println("Hello Kotlin")} 1042 | 1043 | fun main(args: Array) { 1044 | 1045 | {x: Int, y: Int -> 1046 | println("$x plus $y is ${x+y}") 1047 |    }(2, 8)         // 自执行的闭包 1048 | 1049 | plus(2, 8) 1050 | hello() 1051 | } 1052 | 1053 | //输出: 1054 | //   2 plus 8 is 10 1055 | //   2 plus 8 is 10 1056 | // Hello Kotlin 1057 | ``` 1058 | --- 1059 | ### 持续更新中... 1060 | 1061 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /src/HelloKotlin.kt: -------------------------------------------------------------------------------- 1 | import cls.sample.Student 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/22. 5 | */ 6 | fun main(args: Array) { 7 | var list = arrayOf("java", "c++", "Android", "Kotlin", "iOS") 8 | list.map { 9 | "Hello $it" 10 | }.filter { 11 | !it.contains("c") 12 | }.forEach { 13 | println(it) 14 | } 15 | 16 | //var p = Person("nannan", 18, "China") 17 | var p = Person() 18 | var flag: Boolean? = true 19 | flag?.let { 20 | p.sayHello() 21 | } 22 | 23 | var s = Student("zstu", "haohao") 24 | s.sayHello() 25 | 26 | var shape = Shape(Drawer("react")) 27 | shape.drawShape() 28 | 29 | val map = mapOf("a" to 1, "b" to 2, "c" to 3) 30 | map.forEach { (t, u) -> 31 | println("$t, $u") 32 | } 33 | 34 | for ((key, value) in map) { 35 | println("$key, $value") 36 | } 37 | } 38 | 39 | //class Person(var name: String, var age: Int = 18) { 40 | // 41 | // private var address: String? = null 42 | // 43 | // init { 44 | // name = "haohao" 45 | // } 46 | // 47 | // constructor(name: String, age: Int, address: String) : this(name, age){ 48 | // this.address = address 49 | // } 50 | // 51 | // internal fun sayHello() { 52 | // println("Hello! I am $name, $age, from $address") 53 | // } 54 | //} 55 | 56 | class Person public constructor() { 57 | private var name: String? = null 58 | private var age: Int = 25 59 | 60 | constructor (name: String, age: Int) : this() { 61 | this.name = name 62 | this.age = age 63 | } 64 | 65 | internal fun sayHello() { 66 | println("Hello! I am $name, $age.") 67 | } 68 | } 69 | 70 | class Shape (private var drawer: Drawer?){ 71 | 72 | fun drawShape(){ 73 | drawer?.draw() 74 | } 75 | 76 | } 77 | 78 | open class Drawer constructor(var name: String?){ 79 | 80 | fun draw(){ 81 | println("Draw $name") 82 | } 83 | 84 | } 85 | 86 | -------------------------------------------------------------------------------- /src/Main.java: -------------------------------------------------------------------------------- 1 | import java.util.*; 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/25. 5 | */ 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | Map map = new HashMap<>(); 10 | map.put(1, "Java"); 11 | map.put(2, "Kotlin"); 12 | map.put(3, "iOS"); 13 | map.put(4, "React Native"); 14 | 15 | Iterator> iterator = map.entrySet().iterator(); 16 | while (iterator.hasNext()) { 17 | Map.Entry entry = iterator.next(); 18 | System.out.println(entry.getKey() + " , " + entry.getValue()); 19 | } 20 | 21 | List list = Arrays.asList("java", "c++", "Android", "Kotlin", "iOS"); 22 | 23 | for(int i = 0; i < list.size(); i++ ) { 24 | list.set(i, "Hello " + list.get(i)); 25 | if (!list.get(i).contains("c")) { 26 | System.out.println(list.get(i)); 27 | } 28 | } 29 | 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Outer.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by HaohaoChang on 2017/5/25. 3 | */ 4 | public final class Outer { 5 | 6 | private int bar = 100; 7 | 8 | public static class Nester { 9 | 10 | public final String foo() { 11 | 12 | return "Hello Kotlin!"; 13 | } 14 | } 15 | 16 | public final class Inner { 17 | 18 | public final int foo() { 19 | return bar; 20 | } 21 | 22 | } 23 | 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/cls/sample/HighLevelAnimal.kt: -------------------------------------------------------------------------------- 1 | package cls.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/22. 5 | */ 6 | 7 | abstract class HighLevelAnimal { 8 | } 9 | 10 | //fun packageFun() { 11 | // println("Hello! I am package function.") 12 | //} -------------------------------------------------------------------------------- /src/cls/sample/NestedClass.kt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | package cls.sample 5 | 6 | import obj.sample.OnClickListener 7 | import obj.sample.View 8 | 9 | /** 10 | * Created by HaohaoChang on 2017/5/25. 11 | */ 12 | 13 | 14 | class Outer { 15 | private val bar: Int = 12 16 | 17 | // 嵌套类 18 | class Nested { 19 | // 不能访问外部类成员 20 | fun foo() = "hello" 21 | } 22 | 23 | // 内部类 24 | inner public final class Inner { 25 | // 可以访问外部类成员 26 | fun foo() = bar 27 | } 28 | } 29 | 30 | val view = View() 31 | 32 | 33 | fun main(args: Array) { 34 | 35 | println(Outer.Nested().foo()) 36 | println(Outer().Inner().foo()) 37 | 38 | // 使用对象表达式创建匿名内部类 39 | view.setOnClickListener(object : OnClickListener{ 40 | override fun onClick() { 41 | TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 42 | } 43 | }) 44 | 45 | } -------------------------------------------------------------------------------- /src/cls/sample/Person.kt: -------------------------------------------------------------------------------- 1 | package cls.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/22. 5 | */ 6 | open class Person(private var name: String) : HighLevelAnimal() { 7 | open fun sayHello() = println("Hello! I am $name") 8 | 9 | fun say(){ 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /src/cls/sample/Student.kt: -------------------------------------------------------------------------------- 1 | package cls.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/22. 5 | */ 6 | class Student(private var school: String?, name: String): Person(name){ 7 | override fun sayHello() { 8 | super.sayHello() 9 | println("I am from $school") 10 | } 11 | 12 | 13 | 14 | //如果父类函数没有标注 open 如 Person.say(),则子类中不允许定义同名的函数, 不论加不加 override 。 15 | // fun say(){ 16 | // 17 | // } 18 | } -------------------------------------------------------------------------------- /src/data/sample/Main.kt: -------------------------------------------------------------------------------- 1 | package data.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/24. 5 | */ 6 | fun main(args: Array) { 7 | val haohao = User("haohao", 18) 8 | val zuozuo = haohao.copy("zuozuo",1) 9 | println(zuozuo.toString()) 10 | 11 | //解构赋值 12 | val (name, age) = zuozuo 13 | println("$name, $age years old of age.") 14 | // val maps = mapOf(1 to "one", 2 to "two",3 to "three") 15 | // for ((key, value) in maps) { 16 | // println("key = $key, value = $value") 17 | // } 18 | 19 | } -------------------------------------------------------------------------------- /src/data/sample/User.kt: -------------------------------------------------------------------------------- 1 | package data.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/24. 5 | */ 6 | data class User(val name: String, val age: Int) { 7 | } -------------------------------------------------------------------------------- /src/interfs/sample/Main.kt: -------------------------------------------------------------------------------- 1 | package interfs.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/23. 5 | */ 6 | fun main(args: Array){ 7 | val book = StoryBook("《十万个为什么?》") 8 | val newsPaper = NewsPaper("This is a news paper.") 9 | val reader = Reader() 10 | reader.read(book) 11 | reader.read(newsPaper) 12 | } -------------------------------------------------------------------------------- /src/interfs/sample/NewsPaper.kt: -------------------------------------------------------------------------------- 1 | package interfs.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/23. 5 | */ 6 | class NewsPaper(private var news: String): Readable { 7 | override val content: String 8 | get() = news //To change initializer of created properties use File | Settings | File Templates. 9 | 10 | override fun requireContent(): String { 11 | return super.requireContent() 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /src/interfs/sample/Readable.kt: -------------------------------------------------------------------------------- 1 | package interfs.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/23. 5 | */ 6 | interface Readable { 7 | val content: String 8 | 9 | fun requireContent(): String = content 10 | 11 | } -------------------------------------------------------------------------------- /src/interfs/sample/Reader.kt: -------------------------------------------------------------------------------- 1 | package interfs.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/23. 5 | */ 6 | class Reader() { 7 | 8 | fun read(readable: Readable?){ 9 | println(readable?.requireContent()) 10 | } 11 | } -------------------------------------------------------------------------------- /src/interfs/sample/StoryBook.kt: -------------------------------------------------------------------------------- 1 | package interfs.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/23. 5 | */ 6 | class StoryBook(private var story:String): Readable { 7 | override val content: String 8 | get() = story //To change initializer of created properties use File | Settings | File Templates. 9 | 10 | override fun requireContent(): String { 11 | return super.requireContent() 12 | } 13 | } -------------------------------------------------------------------------------- /src/obj/sample/Main.kt: -------------------------------------------------------------------------------- 1 | package obj.sample 2 | 3 | /** 4 | * Created by HaohaoChang on 2017/5/24. 5 | */ 6 | interface OnClickListener { 7 | fun onClick() 8 | } 9 | 10 | class View(){ 11 | var listener: OnClickListener? = null 12 | fun setOnClickListener(listener: OnClickListener) { 13 | this.listener = listener 14 | } 15 | } 16 | 17 | 18 | //对象声明 19 | object SingletonManager { 20 | private var singletonContainer = HashMap() 21 | 22 | fun registerSingleton(key: String, value: Any) { 23 | singletonContainer.set(key, value) 24 | } 25 | 26 | fun getSingleton(key: String): Any? = singletonContainer.get(key) 27 | } 28 | 29 | //伴生对象 30 | interface Factory{ 31 | fun create(): T 32 | } 33 | 34 | class Fragment { 35 | companion object : Factory { 36 | override fun create(): Fragment = Fragment() 37 | fun getTag(): String = Fragment.toString() 38 | } 39 | } 40 | 41 | fun main(args: Array) { 42 | val view = View() 43 | //对象表达式 44 | view.setOnClickListener(object : OnClickListener{ 45 | override fun onClick() { 46 | TODO("not implemented") 47 | } 48 | 49 | }) 50 | 51 | val person = object { 52 | var name: String? = null 53 | var age: Int = 0 54 | override fun toString(): String = "name = ${name}, age = ${age}" 55 | } 56 | 57 | person.name = "haohao" 58 | person.age = 18 59 | println("name = ${person.name}, age = ${person.age}") 60 | 61 | //对象声明 62 | SingletonManager.registerSingleton("view", view) 63 | SingletonManager.registerSingleton("person", person) 64 | 65 | println(SingletonManager.getSingleton("person")) 66 | 67 | //伴生对象 68 | //一个类只能有一个伴生对象 69 | val instance = Fragment.create() 70 | println(Fragment.getTag()) 71 | 72 | 73 | } --------------------------------------------------------------------------------