├── README.md ├── build.gradle ├── settings.gradle └── src ├── main ├── java │ └── com │ │ └── easy │ │ └── kotlin │ │ ├── CompareOperators.java │ │ ├── FilterOddsDemo.java │ │ ├── ForEachDemo.java │ │ ├── HttpProxy.java │ │ ├── InterfaceInvokeDemo.java │ │ ├── JavaCheatSheet.java │ │ ├── ListUtil.java │ │ ├── NullDemos.java │ │ ├── OkHttpUtil.java │ │ ├── POJOBean.java │ │ ├── ParameterizedTypeDemo.java │ │ ├── PrimaryTypes.java │ │ ├── ReflectionDemo.java │ │ ├── StaticVarVSClassloader.java │ │ ├── StringUtil.java │ │ └── TypeVariance.java ├── kotlin │ └── com │ │ └── easy │ │ └── kotlin │ │ ├── AbstractClassDemo.kt │ │ ├── AnnotationDemo.kt │ │ ├── ClassDeclaration.kt │ │ ├── ClassFunctionPropertyExtensions.kt │ │ ├── CollectionsDemo.kt │ │ ├── Complex.kt │ │ ├── DataClass.kt │ │ ├── DataClassDemo.kt │ │ ├── EnumClassDemo.kt │ │ ├── FileIODemo.kt │ │ ├── ForEachIndexed.kt │ │ ├── FunAlsoDemo.kt │ │ ├── FunApplyDemo.kt │ │ ├── FunLetDemo.kt │ │ ├── FunRunDemo.kt │ │ ├── FunWithDemo.kt │ │ ├── GenericTypeDemo.kt │ │ ├── GenericTypeDemoOutIn.kt │ │ ├── HTMLParser.kt │ │ ├── HelloOOP.kt │ │ ├── HelloWorld.kt │ │ ├── HigherOrderFunction.kt │ │ ├── HttpClient.kt │ │ ├── KotlinCheatSheet.kt │ │ ├── ListFilterDemo.kt │ │ ├── NestedClassDemo.kt │ │ ├── NestedClassesDemo.kt │ │ ├── NonNullableType.kt │ │ ├── ObjectDemo.kt │ │ ├── OperatorOverloadDemo.kt │ │ ├── PrimaryTypesKt.kt │ │ ├── ProjectService.kt │ │ ├── ShapeDemo.kt │ │ ├── annotation │ │ └── AnnotationClassNote.kt │ │ ├── chapter │ │ ├── ch01 │ │ │ ├── EasyKotlinDemo.kt │ │ │ ├── HelloWorld.kt │ │ │ ├── HttpClient.kt │ │ │ └── KotlinCheatSheet.kt │ │ ├── ch02 │ │ │ ├── EasyKotlinDemo.kt │ │ │ └── PrimaryTypesKt.kt │ │ ├── ch03 │ │ │ ├── ForEachIndexed.kt │ │ │ └── NonNullableType.kt │ │ ├── ch04 │ │ │ ├── AbstractClassDemo.kt │ │ │ ├── ClassDeclaration.kt │ │ │ ├── DataClass.kt │ │ │ ├── DataClassDemo.kt │ │ │ ├── EnumClassDemo.kt │ │ │ ├── HTMLParser.kt │ │ │ ├── HelloOOP.kt │ │ │ ├── ObjectDemo.kt │ │ │ ├── ProjectService.kt │ │ │ └── ShapeDemo.kt │ │ ├── ch05 │ │ │ ├── FunAlsoDemo.kt │ │ │ ├── FunApplyDemo.kt │ │ │ ├── FunLetDemo.kt │ │ │ ├── FunRunDemo.kt │ │ │ ├── FunWithDemo.kt │ │ │ └── HigherOrderFunction.kt │ │ ├── ch06 │ │ │ └── ExtensionsDemo.kt │ │ ├── ch07 │ │ │ └── CollectionsDemo.kt │ │ ├── ch08 │ │ │ ├── GenericTypeDemo.kt │ │ │ └── GenericTypeDemoOutIn.kt │ │ ├── ch09 │ │ │ └── FileIODemo.kt │ │ ├── ch10 │ │ │ └── EasyKotlinDemo.kt │ │ ├── ch11 │ │ │ ├── EasyKotlinDemo.kt │ │ │ └── OperatorOverloadDemo.kt │ │ └── ch12 │ │ │ ├── EasyKotlinDemo.kt │ │ │ └── ReflectionDemo.kt │ │ ├── reflection │ │ └── ReflectionDemo.kt │ │ └── tutorial │ │ └── ExtensionsDemo.kt └── resources │ └── keyword.md └── test └── kotlin └── com └── easy └── kotlin ├── AnnotationClassNoteTest.kt └── FullJavaInteroperabilityTest.kt /README.md: -------------------------------------------------------------------------------- 1 | # kotlin_tutorials -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | group 'com.easy.kotlin' 2 | version '1.0-SNAPSHOT' 3 | 4 | buildscript { 5 | ext.kotlin_version = '1.2.0' 6 | 7 | repositories { 8 | mavenCentral() 9 | 10 | } 11 | dependencies { 12 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 | } 14 | } 15 | 16 | apply plugin: 'java' 17 | apply plugin: 'kotlin' 18 | 19 | sourceCompatibility = 1.8 20 | 21 | repositories { 22 | mavenCentral() 23 | } 24 | 25 | dependencies { 26 | compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 27 | testCompile group: 'junit', name: 'junit', version: '4.12' 28 | // https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp 29 | compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.9.0' 30 | // https://mvnrepository.com/artifact/com.alibaba/fastjson 31 | compile group: 'com.alibaba', name: 'fastjson', version: '1.2.39' 32 | // https://mvnrepository.com/artifact/org.jsoup/jsoup 33 | compile group: 'org.jsoup', name: 'jsoup', version: '1.10.3' 34 | // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect 35 | compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 36 | // https://mvnrepository.com/artifact/com.google.code.gson/gson 37 | compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2' 38 | } 39 | 40 | compileKotlin { 41 | kotlinOptions.jvmTarget = "1.8" 42 | } 43 | compileTestKotlin { 44 | kotlinOptions.jvmTarget = "1.8" 45 | } 46 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'kotlin_tutorials' 2 | 3 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/CompareOperators.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin; 10 | 11 | import java.math.BigDecimal; 12 | 13 | public class CompareOperators { 14 | public static void main(String[] args) { 15 | int x = 1; 16 | int y = 1; 17 | 18 | boolean b1 = x > y; 19 | boolean b2 = x < y; 20 | boolean b3 = x >= y; 21 | boolean b4 = x <= y; 22 | boolean b5 = x == y; 23 | boolean b6 = x != y; 24 | 25 | System.out.println(b1); 26 | System.out.println(b2); 27 | System.out.println(b3); 28 | System.out.println(b4); 29 | System.out.println(b5); 30 | System.out.println(b6); 31 | 32 | BigDecimal bd1 = BigDecimal.ONE; 33 | BigDecimal bd2 = BigDecimal.ONE; 34 | //boolean b7 = bd1 > bd2; 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | } 44 | } 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/FilterOddsDemo.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import static java.lang.System.out; 8 | 9 | public class FilterOddsDemo { 10 | public static void main(String[] args) { 11 | List list = Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7}); 12 | out.println(filterOdds(list)); 13 | } 14 | 15 | public static List filterOdds(List list) { 16 | List result = new ArrayList(); 17 | for (Integer i : list) { 18 | if (isOdd(i)) { 19 | result.add(i); 20 | } 21 | } 22 | return result; 23 | } 24 | 25 | private static boolean isOdd(Integer i) { 26 | return i % 2 != 0; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/ForEachDemo.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class ForEachDemo { 7 | public static void main(String[] args) { 8 | List list = Arrays.asList(new Integer[] {1, 2, 3, 4, 5}); 9 | int size = list.size(); 10 | for (int index = 0; index < size; index++) { 11 | list.set(index, list.get(index) * list.get(index)); 12 | } 13 | System.out.println(list); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/HttpProxy.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.io.InputStreamReader; 6 | import java.io.InterruptedIOException; 7 | import java.io.OutputStream; 8 | import java.io.Reader; 9 | import java.net.InetAddress; 10 | import java.net.ServerSocket; 11 | import java.net.Socket; 12 | import java.net.UnknownHostException; 13 | 14 | import static java.lang.System.out; 15 | 16 | public class HttpProxy { 17 | 18 | private static final int BUFSIZ = 1024; 19 | 20 | public static void main(String[] args) throws UnknownHostException, IOException { 21 | printLocalIP(); 22 | 23 | // Port of Proxy Server 24 | int InPort = 8081; 25 | // Port of Real Server 26 | int OuPort = 80; 27 | // IP of real server 28 | String OuHost = "127.0.0.1"; 29 | ServerSocket serverSocket = null; 30 | try { 31 | // Build serverSocket with request port 32 | serverSocket = new ServerSocket(InPort); 33 | } catch (IOException e) { 34 | e.printStackTrace(); 35 | System.exit(1); 36 | } 37 | while (true) { 38 | Socket InSocket = null; 39 | Socket OuSocket = null; 40 | InputStream input = null; 41 | OutputStream output = null; 42 | try { 43 | // Receive request 44 | InSocket = serverSocket.accept(); 45 | // Connect with real Server 46 | OuSocket = new Socket(OuHost, OuPort); 47 | // Read request and save in reader 48 | input = InSocket.getInputStream(); 49 | Reader reader = new InputStreamReader(input); 50 | // Transmit request to real Server 51 | output = OuSocket.getOutputStream(); 52 | char chars[] = new char[BUFSIZ]; 53 | int len; 54 | if ((len = reader.read(chars)) != -1) { 55 | String request = new String(chars, 0, len); 56 | int n = request.indexOf("HTTP"); 57 | request = request.substring(0, n + 8); 58 | request += "\n" + "Host:" + OuHost + "\n" + "\n"; 59 | out.println(request); 60 | 61 | output.write(request.getBytes()); 62 | } 63 | // Transmit response that read from real Server 64 | int ir; 65 | byte[] bytes = new byte[BUFSIZ]; 66 | while (true) { 67 | try { 68 | if ((ir = OuSocket.getInputStream().read(bytes)) > 0) { 69 | InSocket.getOutputStream().write(bytes, 0, ir); 70 | } else if (ir < 0) { 71 | break; 72 | } 73 | } catch (InterruptedIOException e) { 74 | } 75 | } 76 | } catch (Exception e) { 77 | e.printStackTrace(); 78 | continue; 79 | } finally { 80 | OuSocket.close(); 81 | InSocket.close(); 82 | } 83 | } 84 | } 85 | 86 | private static void printLocalIP() { 87 | try { 88 | System.out.println("本机的IP = " + InetAddress.getLocalHost()); 89 | } catch (UnknownHostException e) { 90 | e.printStackTrace(); 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/InterfaceInvokeDemo.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | interface G { 8 | Integer apply(String s); 9 | } 10 | 11 | interface F { 12 | Boolean apply(Integer x); 13 | } 14 | 15 | interface H { 16 | Boolean apply(String s); 17 | } 18 | 19 | public class InterfaceInvokeDemo { 20 | public static void main(String[] args) { 21 | G g = (s) -> s.length(); 22 | F f = (x) -> x % 2 != 0; 23 | H h = (s) -> f.apply(g.apply(s)); 24 | 25 | List strings = Arrays.asList(new String[] {"a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg"}); 26 | List result = new ArrayList(); 27 | 28 | for (String s : strings) { 29 | if (h.apply(s)) { 30 | result.add(s); 31 | } 32 | } 33 | 34 | System.out.println(result); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/JavaCheatSheet.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | public class JavaCheatSheet { 4 | public static void main(String[] args) { 5 | System.out.println("Hello,World"); 6 | } 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/ListUtil.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import static java.lang.System.out; 8 | 9 | interface Predicate { 10 | Boolean predicate(T t); 11 | } 12 | 13 | public class ListUtil { 14 | public static void main(String[] args) { 15 | List list = Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7}); 16 | ListUtil listUtil = new ListUtil(); 17 | List result = listUtil.filter(list, (it) -> it % 2 == 1); // lambda 表达式 18 | out.println(result); // [1, 3, 5, 7] 19 | } 20 | 21 | /** 22 | * 根据谓词p 过滤 list 中的元素 23 | * 24 | * @param list 25 | * @param p 26 | * @return 27 | */ 28 | public List filter(List list, Predicate p) { 29 | List result = new ArrayList<>(); 30 | for (T t : list) { 31 | if (p.predicate(t)) { 32 | result.add(t); 33 | } 34 | } 35 | return result; 36 | } 37 | } 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/NullDemos.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | public class NullDemos { 4 | public static void main(String args[]) { 5 | NullDemos nullObject = null; 6 | nullObject.callStaticMethod();// 可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。 7 | nullObject.doMethod(); 8 | } 9 | 10 | private static void callStaticMethod() { 11 | System.out.println("I am static method, can be called by null reference"); 12 | } 13 | 14 | private void doMethod() { 15 | System.out.println("I am NON static method, don't date to call me by null"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/OkHttpUtil.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.io.IOException; 4 | import java.util.concurrent.TimeUnit; 5 | 6 | import okhttp3.Call; 7 | import okhttp3.Callback; 8 | import okhttp3.OkHttpClient; 9 | import okhttp3.Request; 10 | import okhttp3.Response; 11 | 12 | public class OkHttpUtil { 13 | public static String get(String url) { 14 | String result = null; 15 | 16 | OkHttpClient okhttp = new OkHttpClient.Builder() 17 | .connectTimeout(10, TimeUnit.MINUTES) 18 | .readTimeout(10, TimeUnit.MINUTES) 19 | .writeTimeout(10, TimeUnit.MINUTES) 20 | .build(); 21 | 22 | Request request = new Request.Builder() 23 | .url(url) 24 | .build(); 25 | 26 | Call call = okhttp.newCall(request); 27 | 28 | try { 29 | Response response = call.execute(); 30 | result = response.toString(); 31 | } catch (IOException e) { 32 | e.printStackTrace(); 33 | } 34 | return result; 35 | } 36 | 37 | public static void getAsync(String url) { 38 | OkHttpClient okhttp = new OkHttpClient.Builder() 39 | .connectTimeout(10, TimeUnit.MINUTES) 40 | .readTimeout(10, TimeUnit.MINUTES) 41 | .writeTimeout(10, TimeUnit.MINUTES) 42 | .build(); 43 | 44 | Request request = new Request.Builder() 45 | .url(url) 46 | .build(); 47 | 48 | Call call = okhttp.newCall(request); 49 | 50 | call.enqueue(new Callback() { 51 | 52 | @Override 53 | public void onFailure(Call call, IOException e) { 54 | // TODO 55 | } 56 | 57 | @Override 58 | public void onResponse(Call call, Response response) throws IOException { 59 | // TODO 60 | 61 | } 62 | }); 63 | 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/POJOBean.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | public class POJOBean { 4 | } 5 | 6 | class PersonJava { 7 | Integer id; 8 | String name; 9 | 10 | public Integer getId() { 11 | return id; 12 | } 13 | 14 | public void setId(Integer id) { 15 | this.id = id; 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | public PersonJava(Integer id, String name) { 27 | this.id = id; 28 | this.name = name; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/ParameterizedTypeDemo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin; 10 | 11 | import java.lang.reflect.ParameterizedType; 12 | import java.lang.reflect.Type; 13 | 14 | abstract class BaseObject { 15 | } 16 | 17 | public class ParameterizedTypeDemo extends BaseObject { // 实例化T 为 Integer 18 | public static void main(String[] agrs) { 19 | ParameterizedTypeDemo parameterizedTypeDemo = new ParameterizedTypeDemo(); 20 | parameterizedTypeDemo.test(1); 21 | } 22 | 23 | void test(T t) { 24 | System.out.println(t); 25 | 26 | //java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用getGenericSuperclass()方法得到的是父类的泛型。 27 | //getGenericSuperclass()是Generic继承的特例, 28 | //对于这种情况子类会保存父类的Generic参数类型,返回一个ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。 29 | Type genType = this.getClass().getGenericSuperclass(); 30 | Type[] typeArguments = ((ParameterizedType)genType).getActualTypeArguments(); 31 | for (Type type : typeArguments) { 32 | System.out.println(type.getTypeName()); 33 | } 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/PrimaryTypes.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import static java.lang.System.out; 4 | 5 | public class PrimaryTypes { 6 | 7 | public static void main(String[] a) { 8 | //test1(); 9 | //test2(); 10 | test3(); 11 | } 12 | 13 | static void test1() { 14 | // Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题) 15 | out.println("-------------------"); 16 | Integer x = new Integer(123); 17 | Integer y = new Integer(123); 18 | out.println(x == y); 19 | out.println(x.equals(y)); 20 | 21 | out.println("-------------------"); 22 | Integer z = Integer.valueOf(123); 23 | Integer w = Integer.valueOf(123); 24 | out.println(z == w); 25 | out.println(z.equals(w)); 26 | 27 | out.println("-------------------"); 28 | Long a = Long.valueOf(127); 29 | Long b = Long.valueOf(127); 30 | out.println(a == b); 31 | out.println(a.equals(b)); 32 | 33 | out.println("-------------------"); 34 | Long c = Long.valueOf(128); 35 | Long d = Long.valueOf(128); 36 | System.out.println(c == d); 37 | System.out.println(c.equals(d)); 38 | } 39 | 40 | static void test2() { 41 | // Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题) 42 | out.println("-------------------"); 43 | Integer x = new Integer(123); 44 | Long y = new Long(123); 45 | //out.println(x == y); // Error:(43, 23) java: incomparable types: java.lang.Integer and java.lang.Long 46 | out.println(x.equals(y)); 47 | 48 | out.println("-------------------"); 49 | Integer c = Integer.valueOf(128); 50 | Long d = Long.valueOf(128); 51 | //System.out.println(c == d);//Error:(49, 30) java: incomparable types: java.lang.Integer and java.lang.Long 52 | out.println(d.equals(c)); 53 | //out.println(d.compareTo(c)); // Error:(53, 33) java: incompatible types: java.lang.Integer cannot be converted to java.lang.Long 54 | } 55 | 56 | static void test3(){ 57 | double d1 = 1.0d; 58 | double d2 = 0.0d; 59 | for (int i=0; i<10; i++) { 60 | d2 += 0.1d; 61 | } 62 | System.out.println(d2 - d1); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/ReflectionDemo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin; 10 | 11 | import java.lang.annotation.Annotation; 12 | import java.lang.reflect.Field; 13 | import java.lang.reflect.InvocationTargetException; 14 | import java.lang.reflect.Method; 15 | import java.util.Arrays; 16 | import java.util.List; 17 | 18 | interface StudentService { 19 | List findStudents(String name, Integer age); 20 | } 21 | 22 | public class ReflectionDemo { 23 | 24 | public static void main(String[] args) { 25 | StudentServiceImpl studentService = new StudentServiceImpl(); 26 | studentService.save(new Student("Bob", 20)); 27 | studentService.findStudents("Jack", 20); 28 | 29 | // 反射API调用示例 30 | final Class studentServiceClass = studentService.getClass(); 31 | Class[] classes = studentServiceClass.getDeclaredClasses(); 32 | Annotation[] annotations = studentServiceClass.getAnnotations(); 33 | ClassLoader classLoader = studentServiceClass.getClassLoader(); // Returns the class loader for the class 34 | Field[] fields = studentServiceClass.getDeclaredFields(); // 获取类成员变量 35 | Method[] methods = studentServiceClass.getDeclaredMethods(); // 获取类成员方法 36 | try { 37 | methods[0].getName(); // save 38 | methods[0].invoke(studentService, "Jack",20); 39 | } catch (IllegalAccessException e) { 40 | e.printStackTrace(); 41 | } catch (InvocationTargetException e) { 42 | e.printStackTrace(); 43 | } 44 | } 45 | 46 | } 47 | 48 | class StudentServiceImpl extends BaseService implements StudentService { 49 | 50 | public List findStudents(String name, Integer age) { 51 | return Arrays.asList(new Student[] {new Student("Jack", 20), new Student("Rose", 20)}); 52 | } 53 | 54 | @Override 55 | public int save(Student student) { 56 | return 0; 57 | } 58 | } 59 | 60 | abstract class BaseService { 61 | abstract int save(T t); 62 | } 63 | 64 | class Student { 65 | 66 | String name; 67 | Integer age; 68 | 69 | public Student(String name, Integer age) { 70 | this.name = name; 71 | this.age = age; 72 | } 73 | 74 | public String getName() { 75 | return name; 76 | } 77 | 78 | public void setName(String name) { 79 | this.name = name; 80 | } 81 | 82 | public Integer getAge() { 83 | return age; 84 | } 85 | 86 | public void setAge(Integer age) { 87 | this.age = age; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/StaticVarVSClassloader.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | public class StaticVarVSClassloader { 4 | public static void main(String[] args) { 5 | Singleton1 mysingleton1 = Singleton1.GetInstence(); 6 | System.out.println(mysingleton1.a); // 1 7 | System.out.println(mysingleton1.b); // 0 8 | 9 | Singleton2 mysingleton2 = Singleton2.GetInstence(); 10 | System.out.println(mysingleton2.a); // 1 11 | System.out.println(mysingleton2.b); // 1 12 | } 13 | } 14 | 15 | class Singleton1 { 16 | //类中的静态块static块也是顺序地从上到下执行的 17 | public static Singleton1 singleton = new Singleton1(); 18 | public static int a; 19 | public static int b = 0; 20 | 21 | private Singleton1() { 22 | super(); 23 | a++; 24 | b++; 25 | } 26 | 27 | public static Singleton1 GetInstence() { 28 | return singleton; 29 | } 30 | 31 | } 32 | 33 | class Singleton2 { 34 | 35 | public static int a; 36 | public static int b = 0; 37 | public static Singleton2 singleton = new Singleton2(); 38 | 39 | private Singleton2() { 40 | super(); 41 | a++; 42 | b++; 43 | } 44 | 45 | public static Singleton2 GetInstence() { 46 | return singleton; 47 | } 48 | 49 | } 50 | 51 | 52 | /** 53 | 54 | 1. 类在JVM中的工作原理 55 | 要想使用一个Java类为自己工作,必须经过以下几个过程 56 | 1):类加载load:从字节码二进制文件——.class文件将类加载到内存,从而达到类的从硬盘上到内存上的一个迁移,所有的程序必须加载到内存才能工作。将内存中的class放到运行时数据区的方法区内,之后在堆区建立一个java.lang.Class对象,用来封装方法区的数据结构。这个时候就体现出了万事万物皆对象了,干什么事情都得有个对象。就是到了最底层究竟是鸡生蛋,还是蛋生鸡呢?类加载的最终产物就是堆中的一个java.lang.Class对象。 57 | 2):连接:连接又分为以下小步骤 58 | 验证:出于安全性的考虑,验证内存中的字节码是否符合JVM的规范,类的结构规范、语义检查、字节码操作是否合法、这个是为了防止用户自己建立一个非法的XX.class文件就进行工作了,或者是JVM版本冲突的问题,比如在JDK6下面编译通过的class(其中包含注解特性的类),是不能在JDK1.4的JVM下运行的。 59 | 准备:将类的静态变量进行分配内存空间、初始化默认值。(对象还没生成呢,所以这个时候没有实例变量什么事情) 60 | 解析:把类的符号引用转为直接引用(保留) 61 | 3):类的初始化: 将类的静态变量赋予正确的初始值,这个初始值是开发者自己定义时赋予的初始值,而不是默认值。 62 | 2. 类的主动使用与被动使用 63 | 以下是视为主动使用一个类,其他情况均视为被动使用! 64 | 1):初学者最为常用的new一个类的实例对象(声明不叫主动使用) 65 | 2):对类的静态变量进行读取、赋值操作的。 66 | 3):直接调用类的静态方法。 67 | 4):反射调用一个类的方法。 68 | 5):初始化一个类的子类的时候,父类也相当于被程序主动调用了(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,所以这个时候子类不需要进行类初始化)。 69 | 6):直接运行一个main函数入口的类。 70 | 所有的JVM实现(不同的厂商有不同的实现,有人就说IBM的实现比Sun的要好……)在首次主动调用类和接口的时候才会初始化他们。 71 | 72 | */ 73 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/StringUtil.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import static java.lang.System.out; 4 | 5 | public class StringUtil { 6 | 7 | /** 8 | * 获取str的第一个字符值 9 | * 10 | * @param str 11 | * @return 12 | */ 13 | public static String firstChar(String str) { 14 | if (str != null && str.length() > 0) { 15 | return str.charAt(0) + ""; 16 | } 17 | return ""; 18 | } 19 | 20 | /** 21 | * 获取str的最后一个字符值 22 | * 23 | * @param str 24 | * @return 25 | */ 26 | public static String lastChar(String str) { 27 | if (str != null && str.length() > 0) { 28 | return str.charAt(str.length() - 1) + ""; 29 | } 30 | return ""; 31 | } 32 | 33 | public static void main(String[] args) { 34 | String str = "abc"; 35 | out.println(StringUtil.firstChar(str)); // a 36 | out.println(StringUtil.lastChar(str)); // c 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/easy/kotlin/TypeVariance.java: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class TypeVariance { 7 | 8 | public static void main(String[] agrs) { 9 | //Class listStr = List.class; 10 | 11 | //List list0 = new ArrayList(); 12 | List list1 = new ArrayList(); 13 | List list2 = new ArrayList(); 14 | List list3 = new ArrayList(); 15 | testProducer(list1); 16 | testProducer(list2); 17 | testProducer(list3); 18 | 19 | List list4 = new ArrayList(); 20 | List list5 = new ArrayList(); 21 | testConsumer(list4); 22 | testConsumer(list5); 23 | 24 | } 25 | 26 | public static void testProducer(List list) { 27 | //list 中元素的类型是 Number类型 或者 Number的子类型 28 | list.add(null); // ok 29 | list.add(null); // ok 30 | //list1.add(new Integer(1)); // error 31 | //list2.add(new Float(1.1f)); // error 32 | 33 | } 34 | 35 | public static void testConsumer(List list) { 36 | // list 是 List 的子类型,可以安全地写入 Number 的子类对象 37 | list.add(new Integer(3)); // list 中元素类型是 Number类型 或者Number父类型 38 | list.add(new Float(1.0)); 39 | //list.add(new Object()); // error 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/AbstractClassDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin.abstract.demo 2 | 3 | abstract class Shape { 4 | abstract var width: Double 5 | abstract var heigth: Double 6 | abstract var radius: Double 7 | abstract fun area(): Double 8 | 9 | open fun onClick() { 10 | println("I am Clicked!") 11 | } 12 | } 13 | 14 | class Rectangle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 15 | override fun area(): Double { 16 | return heigth * width 17 | } 18 | 19 | override fun onClick() { 20 | println("${this::class.simpleName} is Clicked!") 21 | } 22 | } 23 | 24 | class Circle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 25 | override fun area(): Double { 26 | return 3.14 * radius * radius 27 | } 28 | } 29 | 30 | class Triangle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 31 | override fun area(): Double { 32 | return width * heigth / 2 33 | } 34 | } 35 | 36 | 37 | fun main(args: Array) { 38 | //val s = Shape() // 编译不通过!不能实例化抽象类 39 | val r = Rectangle(3.0, 4.0, 0.0) 40 | println(r.area()) 41 | r.onClick() 42 | 43 | // println(r is Shape) 44 | 45 | val c = Circle(0.0, 0.0, 4.0) 46 | println(c.area()) 47 | c.onClick() 48 | } 49 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/AnnotationDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | annotation class Suspendable 4 | 5 | val fu = @Suspendable { println(1) } 6 | 7 | fun main(args: Array) { 8 | fu.invoke() 9 | 10 | fu.javaClass.declaredAnnotations.forEach { 11 | val name = it.annotationClass.qualifiedName 12 | println(name) 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ClassDeclaration.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | class ClassDeclaration 4 | 5 | class AnEmptyClass 6 | 7 | fun main(args: Array) { 8 | val anEmptyClass = AnEmptyClass() 9 | println(anEmptyClass) 10 | println(anEmptyClass is AnEmptyClass) 11 | println(anEmptyClass::class) 12 | 13 | val person = Person("Jack", 29, "M") 14 | println("person = ${person}") 15 | 16 | val person1 = Person1() 17 | person1.name = "Jack" 18 | person1.age = 29 19 | person1.sex = "M" 20 | println("person1 = ${person1}") 21 | 22 | val person21 = Person2() 23 | person21.name = "Jack" 24 | person21.age = 29 25 | person21.sex = "M" 26 | println("person21 = ${person21}") 27 | 28 | val person22 = Person2("Jack", 29) 29 | person22.sex = "M" 30 | println("person22 = ${person22}") 31 | 32 | val person23 = Person2("Jack", 29, "M") 33 | println("person23 = ${person23}") 34 | } 35 | 36 | class Person(var name: String, var age: Int, var sex: String) { // 一种简洁语法,可以通过主构造器来定义属性并初始化属性值(可以是var或val) 37 | override fun toString(): String { 38 | return "Person(name='$name', age=$age, sex='$sex')" 39 | } 40 | } 41 | 42 | class Person1 { 43 | lateinit var name: String 44 | var age: Int = 0 45 | lateinit var sex: String 46 | override fun toString(): String { 47 | return "Person1(name='$name', age=$age, sex='$sex')" 48 | } 49 | } 50 | 51 | class Person2 { 52 | lateinit var name: String 53 | var age: Int = 0 54 | lateinit var sex: String 55 | 56 | constructor() 57 | 58 | constructor(name: String) { 59 | this.name = name 60 | } 61 | 62 | constructor(name: String, age: Int) : this(name) { 63 | this.name = name 64 | this.age = age 65 | } 66 | 67 | constructor(name: String, age: Int, sex: String) : this(name, age) { 68 | this.name = name 69 | this.age = age 70 | this.sex = sex 71 | } 72 | 73 | override fun toString(): String { 74 | return "Person1(name='$name', age=$age, sex='$sex')" 75 | } 76 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ClassFunctionPropertyExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | fun String.firstChar(): String { 4 | if (this.length == 0) { 5 | return "" 6 | } 7 | return this[0].toString() 8 | } 9 | 10 | fun String.lastChar(): String { 11 | if (this.length == 0) { 12 | return "" 13 | } 14 | return this[this.length - 1].toString() 15 | } 16 | 17 | 18 | fun String.inc(): String { 19 | var result = "" 20 | this.map { result += it + 1 } 21 | return result 22 | } 23 | 24 | 25 | fun List.filter(predicate: (T) -> Boolean): MutableList { 26 | val result = ArrayList() 27 | this.forEach { 28 | if (predicate(it)) { 29 | result.add(it) 30 | } 31 | } 32 | return result 33 | } 34 | 35 | var MutableList.firstElement: T 36 | get() { 37 | return this[0] 38 | } 39 | set(value) { 40 | this[0] = value 41 | } 42 | 43 | var MutableList.lastElement: T 44 | get() { 45 | return this[this.size - 1] 46 | } 47 | set(value) { 48 | this[this.size - 1] = value 49 | } 50 | 51 | 52 | fun main(args: Array) { 53 | "abc".firstChar() 54 | 55 | val str = "abc" 56 | println(str.firstChar()) // a 57 | println(str.lastChar()) // c 58 | println(str.inc()) // 59 | 60 | val list = mutableListOf(1, 2, 3, 4, 5, 6, 7) 61 | val result = list.filter { 62 | it % 2 == 1 63 | } 64 | println(result) // [1, 3, 5, 7] 65 | 66 | println("list = ${list}") // list = [1, 2, 3, 4, 5, 6, 7] 67 | println(list.firstElement) // 1 68 | println(list.lastElement) // 7 69 | 70 | list.firstElement = -1 71 | list.lastElement = -7 72 | 73 | println("list = ${list}") // list = [-1, 2, 3, 4, 5, 6, -7] 74 | println(list.firstElement) // -1 75 | println(list.lastElement) // -7 76 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/CollectionsDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin.collections 2 | 3 | fun main(args: Array) { 4 | val emptyList: List = listOf() 5 | val emptySet: Set = setOf() 6 | val emptyMap: Map = mapOf() 7 | 8 | val list = listOf(1, 2, 3, 4, 5, 6, 7) 9 | val mutableList = mutableListOf("a", "b", "c") 10 | 11 | val set = setOf(1, 2, 3, 4, 5, 6, 7) 12 | val mutableSet = mutableSetOf("a", "b", "c") 13 | 14 | val map = mapOf(1 to "a", 2 to "b", 3 to "c") 15 | val mutableMap = mutableMapOf(1 to "X", 2 to "Y", 3 to "Z") 16 | 17 | 18 | 19 | list.forEach { 20 | println(it) 21 | } 22 | 23 | 24 | set.forEach { 25 | println(it) 26 | } 27 | 28 | 29 | map.forEach { 30 | println("K = ${it.key}, V = ${it.value}") 31 | } 32 | 33 | 34 | 35 | list.forEachIndexed { index, value -> 36 | println("list index = ${index} , value = ${value}") 37 | } 38 | 39 | set.forEachIndexed { index, value -> 40 | println("set index = ${index} , value = ${value}") 41 | } 42 | 43 | mutableList.forEach { 44 | println(it) 45 | } 46 | 47 | val result1 = list.filter { it % 2 == 1 } 48 | 49 | val funlist: List<(Int) -> Boolean> = 50 | listOf({ it -> it % 2 == 0 }, 51 | { it -> it % 2 == 1 }) 52 | 53 | val result2 = list.filter(funlist[0]) 54 | val result3 = list.filter(funlist[1]) 55 | 56 | println("result1 = ${result1}") 57 | println("result2 = ${result2}") 58 | println("result3 = ${result3}") 59 | 60 | list.filterIndexed { index, it -> index % 2 == 0 && it > 3 } 61 | 62 | 63 | list.map { it * it } // [1, 4, 9, 16, 25, 36, 49] 64 | set.map { it + 1 } // [2, 3, 4, 5, 6, 7, 8] 65 | map.map { it.value + "$" } // [a$, b$, c$] 66 | 67 | val strlist = listOf("a", "b", "c") 68 | println(strlist.map { it -> listOf(it + 1, it + 2, it + 3, it + 4) }) 69 | println(strlist.map { it -> listOf(it + 1, it + 2, it + 3, it + 4) }.flatten()) 70 | println(strlist.flatMap { it -> listOf(it + 1, it + 2, it + 3, it + 4) }) 71 | 72 | val studentList = listOf( 73 | Student(1, "Jack", 18, 90), 74 | Student(2, "Rose", 17, 80), 75 | Student(3, "Alice", 16, 70) 76 | ) 77 | println(studentList.filter { it.age >= 18 }) 78 | println(studentList.filter { it.score < 80 }) 79 | 80 | 81 | val dupList = listOf(1, 1, 2, 2, 3, 3, 3) 82 | println(dupList.distinct()) // [1, 2, 3] 83 | 84 | } 85 | 86 | fun orderFun(){ 87 | val list = listOf(1, 2, 3, 4, 5, 6, 7) 88 | val set = setOf(1,3,2) 89 | 90 | list.reversed() // [7, 6, 5, 4, 3, 2, 1] 91 | set.reversed() // [2, 3, 1] 92 | 93 | list.sorted() 94 | set.sorted() 95 | } 96 | 97 | 98 | data class Student(var id: Long, var name: String, var age: Int, var score: Int) { 99 | override fun toString(): String { 100 | return "Student(id=$id, name='$name', age=$age, score=$score)" 101 | } 102 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/Complex.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | import java.math.BigDecimal 12 | 13 | class Complex { 14 | var real: Int = 0 15 | var image: Int = 0 16 | 17 | constructor() 18 | constructor(real: Int, image: Int) { 19 | this.real = real 20 | this.image = image 21 | } 22 | 23 | /** 24 | * 复数加法 25 | * (a+bi) + (c+di) = ( a + c )+ ( b + d )i 26 | */ 27 | operator fun plus(c: Complex): Complex { 28 | return Complex(this.real + c.real, this.image + c.image) 29 | } 30 | 31 | /** 32 | * 复数减法 33 | * (a+bi) - (c+di) = (a - c)+ (b - d)i 34 | */ 35 | 36 | operator fun minus(c: Complex): Complex { 37 | return Complex(this.real - c.real, this.image - c.image) 38 | } 39 | 40 | /** 41 | * 复数乘法 42 | * (a+bi)(c+di) = ac-db + (bc+ad)i 43 | */ 44 | operator fun times(c: Complex): Complex { 45 | return Complex(this.real * c.real - this.image * c.image, this.real * c.image + this.image * c.real) 46 | } 47 | 48 | override fun toString(): String { 49 | val img = if (image >= 0) "+ ${image}i" else "${image}i" 50 | return "$real ${img} " 51 | } 52 | } 53 | 54 | fun main(args: Array) { 55 | val c1 = Complex(1, 1) 56 | val c2 = Complex(2, 2) 57 | val p = c1 + c2 58 | val m = c1 - c2 59 | val t = c1 * c2 60 | 61 | println(p) 62 | println(m) 63 | println(t) 64 | 65 | var bigDecimal1 = BigDecimal(100) 66 | var bigDecimal2 = BigDecimal(100) 67 | val tmp1 = bigDecimal1++ 68 | val tmp2 = ++bigDecimal2 69 | println(tmp1)// 100 70 | println(tmp2)// 101 71 | println(bigDecimal1) // 101 72 | println(bigDecimal2) // 101 73 | 74 | 75 | var bigDecimal3 = BigDecimal(100) 76 | var bigDecimal4 = BigDecimal(100) 77 | val tmp3 = bigDecimal3-- 78 | val tmp4 = --bigDecimal4 79 | println(tmp3)// 100 80 | println(tmp4)// 99 81 | println(bigDecimal3) // 99 82 | println(bigDecimal4) // 99 83 | 84 | 85 | 86 | 87 | } 88 | 89 | 90 | operator fun BigDecimal.inc() = this + BigDecimal.ONE 91 | operator fun BigDecimal.dec() = this - BigDecimal.ONE 92 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/DataClass.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | data class PersonKotlin(val id: Int, val name: String) 4 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/DataClassDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | data class LoginUser(val username: String, val password: String) 4 | 5 | interface DataInterface 6 | 7 | data class LoginUser2(var username: String, var password: String) : DataInterface { 8 | 9 | } 10 | 11 | 12 | data class DataEmpty(var param: String) // 数据类至少有1个参数 13 | //data class DataClassDemoPPP(param: String) // 数据类至少有1个参数 14 | 15 | 16 | 17 | fun main(args: Array) { 18 | val loginUser = LoginUser("root", "111111") 19 | 20 | println(loginUser) 21 | println(loginUser.username) 22 | println(loginUser.password) 23 | 24 | println(loginUser.component1()) 25 | println(loginUser.component2()) 26 | 27 | val (username, password) = loginUser // 解构声明 28 | println("username = ${username}") 29 | println("password = ${password}") 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/EnumClassDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | 4 | enum class Direction { 5 | NORTH, SOUTH, WEST, EAST // 每个枚举常量都是一个对象, 用逗号分隔 6 | } 7 | 8 | 9 | enum class Color(val rgb: Int) { 10 | RED(0xFF0000), 11 | GREEN(0x00FF00), 12 | BLUE(0x0000FF) 13 | } 14 | 15 | fun main(args: Array) { 16 | val east = Direction.EAST 17 | println(east.name) 18 | println(east.ordinal) 19 | 20 | println(Direction.NORTH.name) 21 | println(Direction.NORTH.ordinal) 22 | 23 | val c = Color.GREEN 24 | println(c.rgb) 25 | println(c.name) 26 | println(c.ordinal) 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FileIODemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import java.io.File 4 | import java.net.URL 5 | import java.nio.charset.Charset 6 | 7 | fun getUrlContent(url: String): String { 8 | return URL(url).readText(Charset.defaultCharset()) 9 | } 10 | 11 | fun getUrlBytes(url: String): ByteArray { 12 | return URL(url).readBytes() 13 | } 14 | 15 | fun writeUrlBytesTo(filename: String, url: String) { 16 | val bytes = URL(url).readBytes() 17 | File(filename).writeBytes(bytes) 18 | } 19 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ForEachIndexed.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import java.util.* 4 | 5 | 6 | fun forEachIndexedTest() { 7 | val list = mutableListOf(1, 2, 3, 4, 5) 8 | list.forEachIndexed { index, i -> list[index] = i * i } 9 | println(list) 10 | } 11 | 12 | 13 | fun letFun() { 14 | val listWithNulls = listOf("A", "B", "C", null, null, "D") 15 | listWithNulls.forEach { it?.let { println(it) } } 16 | } 17 | 18 | fun main(args: Array) { 19 | println(Date()) 20 | forEachIndexedTest() 21 | letFun() 22 | } 23 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FunAlsoDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | fun testAlsoFun() { 12 | val a = "ABC".also { 13 | println(it) // ABC 14 | } 15 | println(a) // ABC 16 | a.let { 17 | println(it) // ABC 18 | } 19 | } 20 | 21 | fun main(args: Array) { 22 | testAlsoFun() 23 | } 24 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FunApplyDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | fun testApply() { 12 | // 普通写法 13 | val list = mutableListOf() 14 | list.add("A") 15 | list.add("B") 16 | list.add("C") 17 | println("普通写法 list = $list") // 常规写法 list = [A, B, C] 18 | println(list) 19 | 20 | // 使用 apply 函数写法 21 | val a = ArrayList().apply { 22 | add("A") 23 | add("B") 24 | add("C") 25 | println("使用 apply 函数写法 this = $this") 26 | } 27 | println(a) 28 | // 等价于 29 | a.let { println(it) } 30 | } 31 | 32 | fun main(args: Array) { 33 | testApply() 34 | } 35 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FunLetDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | fun myfun(): String { 12 | println("执行了 myfun 函数") 13 | return "这是 myfun 的返回值" 14 | } 15 | 16 | fun testLetFun() { 17 | 1.let { println(it) } // 1 18 | "ABC".let { println(it) } // ABC 19 | // 执行完函数 myfun(), 返回值传给 let 函数 20 | myfun().let { 21 | print(it) 22 | } 23 | } 24 | 25 | fun main(args: Array) { 26 | testLetFun() 27 | } 28 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FunRunDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | 12 | fun testRunFun() { 13 | myfun() 14 | run({ myfun() }) 15 | run { myfun() } 16 | run { println("A") } 17 | } 18 | 19 | fun main(args: Array) { 20 | testRunFun() 21 | } 22 | 23 | /* 输出: 24 | 25 | 执行了 myfun 函数 26 | 执行了 myfun 函数 27 | 执行了 myfun 函数 28 | A 29 | 30 | */ 31 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/FunWithDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | fun testWithFun() { 12 | // 普通写法 13 | val list = mutableListOf() 14 | list.add("A") 15 | list.add("B") 16 | list.add("C") 17 | println("常规写法 list = $list") // 常规写法 list = [A, B, C] 18 | 19 | // 使用 with 函数写法 20 | with(ArrayList()) { 21 | add("A") 22 | add("B") 23 | add("C") 24 | println("使用 with 函数写法 this = $this") // 使用 with 函数的写法 this = [A, B, C] 25 | }.let { 26 | println(it) // kotlin.Unit 27 | } 28 | } 29 | 30 | fun main(args: Array) { 31 | testWithFun() 32 | } 33 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/GenericTypeDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import java.util.* 4 | 5 | val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c") 6 | 7 | open class Food 8 | open class Fruit : Food() 9 | class Apple : Fruit() 10 | class Banana : Fruit() 11 | class Grape : Fruit() 12 | 13 | 14 | object GenericTypeDemo { 15 | 16 | fun addFruit(fruit: MutableList) { 17 | // TODO 18 | } 19 | 20 | fun getFruit(fruit: MutableList) { 21 | // TODO 22 | } 23 | 24 | fun addApple(apple: MutableList) { 25 | // TODO 26 | } 27 | 28 | fun getApple(apple: MutableList) { 29 | // TODO 30 | } 31 | 32 | } 33 | 34 | fun main(args: Array) { 35 | val fruits: MutableList = mutableListOf(Fruit(), Fruit(), Fruit()) 36 | GenericTypeDemo.addFruit(fruits) 37 | GenericTypeDemo.getFruit(fruits) 38 | 39 | val apples: MutableList = mutableListOf(Apple(), Apple(), Apple()) 40 | // GenericTypeDemo.addFruit(apples) // type mismatch 41 | // GenericTypeDemo.getFruit(apples) // type mismatch 42 | GenericTypeDemo.addApple(apples) 43 | GenericTypeDemo.getApple(apples) 44 | 45 | testContainer() 46 | testGenerator() 47 | testGenericClass() 48 | 49 | 50 | // MutableList::class 51 | MutableList::class 52 | } 53 | 54 | //泛型类 55 | class Container(var key: K, var value: V) { 56 | override fun toString(): String { 57 | return "Container(key=$key, value=$value)" 58 | } 59 | } 60 | 61 | fun testContainer() { 62 | val container = Container(1, "A") 63 | println("container = ${container}") 64 | } 65 | 66 | //泛型接口 67 | interface Generator { 68 | operator fun next(): T 69 | } 70 | 71 | fun testGenerator() { 72 | val gen = object : Generator { 73 | override fun next(): Int { 74 | return Random().nextInt(10) 75 | } 76 | } 77 | println(gen.next()) 78 | } 79 | 80 | 81 | // 泛型方法 82 | class GenericClass { 83 | fun console(t: T) { 84 | println(t) 85 | } 86 | } 87 | 88 | interface GenericInterface { 89 | fun console(t: T) 90 | } 91 | 92 | fun > gt(x: T, y: T): Boolean { 93 | return x > y 94 | } 95 | 96 | //fun gt1(x: T, y: T): Boolean { 97 | // return x > y // 编译不通过 98 | //} 99 | 100 | 101 | fun testGenericClass() { 102 | val gen = GenericClass() 103 | gen.console("X") 104 | } 105 | 106 | 107 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/GenericTypeDemoOutIn.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | 4 | fun main(args: Array) { 5 | val fruits: MutableList = mutableListOf(Fruit(), Fruit(), Fruit()) 6 | GenericTypeDemoOutIn.addFruit(fruits) 7 | GenericTypeDemoOutIn.getFruit(fruits) 8 | 9 | val apples: MutableList = mutableListOf(Apple(), Apple(), Apple()) 10 | GenericTypeDemoOutIn.getFruit(apples) 11 | // GenericTypeDemoOutIn.addFruit(apples) // type mismatch, 只能传入Fruit类型及其超类型 12 | 13 | val foods: MutableList = mutableListOf(Food(), Food(), Food()) 14 | GenericTypeDemoOutIn.addFruit(foods) 15 | // GenericTypeDemoOutIn.getFruit(foods) // type mismatch, 只能传入Fruit类型及其超类型 16 | } 17 | 18 | object GenericTypeDemoOutIn { 19 | 20 | fun addFruit(superFruit: MutableList) { // 21 | // superFruit 限制为只能传入 Fruit 类型及其父类型, 22 | // 这样我们就可以安全地向superFruit 添加 Fruit 类型了。 23 | superFruit.add(Fruit()) 24 | superFruit.add(Apple()) 25 | superFruit.add(Banana()) 26 | superFruit.add(Grape()) 27 | // superFruit.add(Food()) // Type mismatch,不能放入 Fruit 的超类型 28 | println("superFruit = ${superFruit}") 29 | 30 | // val f0: Fruit = superFruit[0] // Any? , Type mismatch 31 | // val f1: Fruit = superFruit[1] // Any? , Type mismatch 32 | 33 | } 34 | 35 | fun getFruit(extendsFruit: MutableList) { // 36 | // extendsFruit 传入的可能为 MutableList , 37 | // 也可能为 MutableList , 38 | // 也可能为 MutableList , 39 | // 也可能为 MutableList 等等,所以我们不能向 extendsFruit 中写入 Fruit(),Apple()对象, 40 | // 因为编译器不知道会传入什么样的 fruit 类型 41 | 42 | // extendsFruit.add(Fruit()) // out 投射类型, 禁止使用 add 43 | // extendsFruit.add(Apple()) // out 投射类型, 禁止使用 add 44 | extendsFruit.forEach { println(it) } 45 | } 46 | 47 | } 48 | 49 | 50 | fun countGreaterThan(elements: Array, target: T): Int { 51 | var count = 0 52 | for (e in elements){ 53 | // if (e > target) {// 编译不通过,除了 Short, Int 等原始类型,其他的类并不一定重载了操作符 > 54 | // ++count 55 | // } 56 | } 57 | 58 | return count 59 | } 60 | 61 | interface Comparable { 62 | operator fun compareTo(o: T): Int 63 | } 64 | 65 | fun > countGreaterThan(elements: Array, target: T): Int { // T : Comparable ,其中 Comparable 是类型 T 的上界 66 | // 也就是告诉编译器,类型参数 T 代表的都是实现了 Comparable 接口的类,这样等于告诉编译器它们都实现了compareTo方法。 67 | var count = 0 68 | for (e in elements){ 69 | if (e > target) { 70 | ++count 71 | } 72 | } 73 | 74 | return count 75 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/HTMLParser.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import org.jsoup.Jsoup 4 | import org.jsoup.nodes.Element 5 | import org.jsoup.select.Elements 6 | import java.net.URL 7 | 8 | object HTMLParser { 9 | fun getElementsByAttributeValue(html: String, attribute: String, name: String): Elements { 10 | val document = Jsoup.parse(html) 11 | return document.html(html).getElementsByAttributeValue(attribute, name) 12 | } 13 | 14 | fun getElementsByClass(html: String, className: String, name: String): Elements { 15 | val document = Jsoup.parse(html) 16 | return document.html(html).getElementsByClass(className) 17 | } 18 | 19 | fun getElementsByTag(html: String, tagName: String): Elements { 20 | val document = Jsoup.parse(html) 21 | return document.html(html).getElementsByTag(tagName) 22 | } 23 | 24 | fun getElementsById(html: String, id: String): Element { 25 | val document = Jsoup.parse(html) 26 | return document.html(html).getElementById(id) 27 | } 28 | 29 | 30 | } 31 | 32 | fun main(args: Array) { 33 | val url = URL("https://www.baidu.com/") 34 | val html = url.readText() 35 | 36 | //document.getElementsByTagName("title")[0].innerHTML 37 | val elements = HTMLParser.getElementsByTag(html, "title") 38 | elements.eachText().forEach { println(it) } 39 | 40 | val form = HTMLParser.getElementsById(html, "form") 41 | form.allElements.forEach { 42 | println(it.html()) 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/HelloOOP.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | class HelloOOP { 4 | 5 | } 6 | 7 | 8 | class Empty 9 | 10 | 11 | fun main(args: Array) { 12 | val empty = Empty() 13 | println(empty) 14 | } 15 | 16 | 17 | class Employee(val name: String, val workno: String, val sex: String, val age: Int) { 18 | override fun toString(): String { 19 | return "Employee(name='$name', workno='$workno', sex='$sex', age=$age)" 20 | } 21 | } 22 | 23 | 24 | class Department { 25 | var deptNo: Int = 0 26 | lateinit var deptName: String 27 | 28 | override fun toString(): String { 29 | return "Department(deptNo=$deptNo, deptName='$deptName')" 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/HelloWorld.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | fun main(args: Array) { 4 | println("Hello,World!") 5 | } 6 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/HigherOrderFunction.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | // http://www.jianshu.com/p/61db795324bd 4 | // 简单好用的 Kotlin 类型别名, 我们使用 G,F,H 声明了3个函数类型(有点类似Java 中的接口类型的概念) 5 | typealias G = (String) -> Int 6 | typealias F = (Int) -> Boolean 7 | typealias H = (String) -> Boolean 8 | 9 | fun main(args: Array) { 10 | val strList = listOf("a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg") 11 | // 非常好用的流式 API filter,flat,map 等等 12 | val mstrList = strList.filter(h(g, f)) 13 | println(mstrList) 14 | 15 | 16 | mstrList.forEachIndexed { index, value -> 17 | println("$value = ${value.length}") 18 | } 19 | 20 | println(foo(1, { it -> it + 1 })) 21 | println(foo(10, { it -> it * it })) 22 | } 23 | 24 | // 简单直接的函数定义 25 | val f = fun(x: Int) = x % 2 == 1 // 判断输入的Int是否奇数 26 | val g = fun(s: String) = s.length // 返回输入的字符串参数的长度 27 | // 简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*)) 28 | val h = fun(g: G, f: F): H { 29 | return { f(g(it)) } 30 | } 31 | 32 | 33 | fun foo(x: Int = 1, transform: (Int) -> T = { it as T }) = transform(x) -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/HttpClient.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import okhttp3.* 4 | import java.io.IOException 5 | import java.util.concurrent.TimeUnit 6 | 7 | 8 | fun main(args: Array) { 9 | val hasRunningInstanceApi = "http://h5agent.alibaba.net/hasRunningInstance" 10 | val runApi = "http://h5agent.alibaba.net/run?timestamp=2000000000000&url=http://www.baidu.com" 11 | val runApiIP = "http://h5agent.alibaba.net/run?timestamp=2000000000000&url=http://www.baidu.com" 12 | // getAsync(hasRunningInstanceApi) 13 | // getAsync(runApi) 14 | // getAsync(runApiIP) 15 | get(hasRunningInstanceApi) 16 | // get(runApi) 17 | // get(runApiIP) 18 | } 19 | 20 | fun get(url: String): String? { 21 | var result: String? = "" 22 | val okhttp = OkHttpClient.Builder() 23 | .connectTimeout(10, TimeUnit.MINUTES) 24 | .readTimeout(10, TimeUnit.MINUTES) 25 | .writeTimeout(10, TimeUnit.MINUTES) 26 | .build() 27 | 28 | val request = Request.Builder() 29 | .url(url) 30 | .addHeader("Connection", "close") 31 | .build() 32 | 33 | val call = okhttp.newCall(request) 34 | 35 | try { 36 | val response = call.execute() 37 | result = response.body()?.string() 38 | println(result) 39 | 40 | } catch (e: IOException) { 41 | e.printStackTrace() 42 | } 43 | 44 | return result 45 | } 46 | 47 | 48 | fun getAsync(url: String) { 49 | val okhttp = OkHttpClient.Builder() 50 | .connectTimeout(10, TimeUnit.MINUTES) 51 | .readTimeout(10, TimeUnit.MINUTES) 52 | .writeTimeout(10, TimeUnit.MINUTES) 53 | .build() 54 | 55 | val request = Request.Builder() 56 | .url(url) 57 | .build() 58 | 59 | val call = okhttp.newCall(request) 60 | 61 | call.enqueue(object : Callback { 62 | override fun onFailure(call: Call, e: IOException) { 63 | println(e.message) 64 | e.printStackTrace() 65 | } 66 | 67 | override fun onResponse(call: Call, response: Response) { 68 | try { 69 | val result = response.body()?.string() 70 | println(result) 71 | } catch (e: IOException) { 72 | println("response = ${response}") 73 | e.printStackTrace() 74 | } 75 | } 76 | }) 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/KotlinCheatSheet.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | fun main(args: Array) { 4 | // println("Hello,World") 5 | // println(isLeapYear(2017)) 6 | // println(isLeapYear(2020)) 7 | // casesWhen(1) 8 | // casesWhen("hello") 9 | // casesWhen('X') 10 | // casesWhen(null) 11 | // println(fact(10)) 12 | println(sumFact(10)) 13 | } 14 | 15 | fun isLeapYear(year: Int): Boolean { 16 | var isLeapYear: Boolean 17 | if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { 18 | isLeapYear = true 19 | } else { 20 | isLeapYear = false 21 | } 22 | return isLeapYear 23 | } 24 | 25 | fun casesWhen(obj: Any?) { 26 | when (obj) { 27 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 -> println("${obj} ===> 这是一个0-9之间的数字") 28 | "hello" -> println("${obj} ===> 这个是字符串hello") 29 | is Char -> println("${obj} ===> 这是一个 Char 类型数据") 30 | else -> println("${obj} ===> else类似于Java中的 case-switch 中的 default") 31 | } 32 | var x = 10 33 | when{ 34 | x in 6..10 -> println("大于6小于等于10") 35 | x < 6 -> println("小于6") 36 | else -> println("其他") 37 | } 38 | } 39 | 40 | //编写一个 Kotlin 程序在屏幕上输出1!+2!+3!+……+10!的和 41 | fun sumFact(n: Int): Int { 42 | var sum = 0 43 | for (i in 1..n) { 44 | sum += fact(i) 45 | } 46 | return sum 47 | } 48 | 49 | 50 | fun fact(n: Int): Int { 51 | var result = 1 52 | when (n) { 53 | 0, 1 -> result = 1 54 | else -> result = n * fact(n - 1) 55 | } 56 | return result 57 | } 58 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ListFilterDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | fun main(args: Array) { 4 | val list = listOf(1, 2, 3, 4, 5, 6, 7) 5 | println(list.filter { it % 2 == 1 }) // lambda表达式 6 | println(list.filter({ it % 2 == 1 })) 7 | println(list.filter({ it -> it % 2 == 1 })) 8 | 9 | val isOdd = { it: Int -> it % 2 == 1 } 10 | println(list.filter(isOdd)) 11 | 12 | val sum = fun(x: Int, y: Int): Int { return x + y } 13 | println(sum(1, 1)) // 2 14 | 15 | println(multiply(2, 2)) // 4 16 | } 17 | 18 | fun multiply(x: Int, y: Int): Int { 19 | return x * y 20 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/NestedClassDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | class A { 4 | val a = 1 5 | 6 | class B { 7 | val b = 2 8 | 9 | class C { 10 | val c = 3 11 | fun printC() { 12 | // println(a) 13 | // println(b) 14 | println(c) 15 | } 16 | 17 | } 18 | } 19 | } 20 | 21 | 22 | class D { 23 | val d = 4 24 | 25 | inner class E { 26 | val e = 5 27 | 28 | inner class F { 29 | val f = 6 30 | 31 | fun printlnF() { 32 | println(f) 33 | println(e) 34 | println(d) 35 | } 36 | } 37 | 38 | } 39 | } 40 | 41 | 42 | fun anonymousInnerClassDemo() { 43 | Thread { 44 | println("RUN") 45 | }.start() 46 | 47 | Thread(Runnable { println("RUN") }).start() 48 | 49 | Thread(object : Runnable { 50 | override fun run() { 51 | println("RUN") 52 | } 53 | }).start() 54 | } 55 | 56 | fun main(args: Array) { 57 | val classC = A.B.C().printC() 58 | 59 | val classF = D().E().F().printlnF() 60 | 61 | anonymousInnerClassDemo() 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/NestedClassesDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | class NestedClassesDemo { 4 | class Outer { 5 | private val zero: Int = 0 6 | val one: Int = 1 7 | 8 | inner class Inner { 9 | fun accessOuter() = { 10 | println(zero) // works 11 | println(one) // works 12 | } 13 | 14 | } 15 | } 16 | 17 | 18 | class AnonymousInnerClassDemo { 19 | var isRunning = false 20 | fun doRun() { 21 | Thread(object : Runnable { // 匿名内部类 22 | override fun run() { 23 | isRunning = true 24 | println("doRun : i am running, isRunning = $isRunning") 25 | } 26 | }).start() 27 | } 28 | } 29 | } 30 | 31 | 32 | fun doStop() { 33 | var isRunning = true 34 | Thread({ 35 | isRunning = false 36 | println("doStop: i am not running, isRunning = $isRunning") 37 | }).start() 38 | } 39 | 40 | fun doWait() { 41 | var isRunning = true 42 | val wait = Runnable { 43 | isRunning = false 44 | println("doWait: i am waiting, isRunning = $isRunning") 45 | } 46 | Thread(wait).start() 47 | } 48 | 49 | fun doNotify() { 50 | var isRunning = true 51 | val wait = { 52 | isRunning = false 53 | println("doNotify: i notify, isRunning = $isRunning") 54 | } 55 | Thread(wait).start() 56 | } 57 | 58 | 59 | fun main(args: Array) { 60 | val innerClass = NestedClassesDemo.Outer().Inner().accessOuter() 61 | } 62 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/NonNullableType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | 12 | fun main(args: Array) { 13 | val a = "abc" 14 | a.length 15 | val b: String? = null 16 | b?.length 17 | } 18 | 19 | /** 20 | * Kotlin 与 Java 完全无缝互操作 21 | */ 22 | fun getArrayList(): List { 23 | val arrayList = ArrayList() 24 | arrayList.add("A") 25 | arrayList.add("B") 26 | arrayList.add("C") 27 | return arrayList 28 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ObjectDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | object StringUtilKt { 4 | fun isEmpty(str: String): Boolean { 5 | return str.trim() == "" 6 | } 7 | } 8 | 9 | fun main(args: Array) { 10 | val b = StringUtilKt.isEmpty("") 11 | println(b) 12 | 13 | val p = DataProcessor() 14 | p.processHTML() 15 | p.processJSON() 16 | // p.processText() 17 | DataProcessor.processText() 18 | 19 | } 20 | 21 | 22 | class DataProcessor { 23 | fun processJSON() { 24 | println("Process JSON") 25 | } 26 | 27 | fun processHTML() { 28 | println("Process HTML") 29 | } 30 | 31 | companion object { // 伴生对象 32 | fun processText() { 33 | println("Process Text") 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/OperatorOverloadDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | import java.math.BigDecimal 4 | 5 | class BoxInt(var i: Int) { 6 | 7 | operator fun times(x: BoxInt) = BoxInt(i * x.i) 8 | 9 | override fun toString(): String { 10 | return i.toString() 11 | } 12 | } 13 | 14 | operator fun BoxInt.plus(x: BoxInt) = BoxInt(this.i + x.i) 15 | 16 | fun main(arg: Array) { 17 | val a = BoxInt(3) 18 | val b = BoxInt(7) 19 | 20 | a + b 21 | a * b 22 | 23 | println(a + b) //10 24 | println(a * b) //21 25 | 26 | 1 in 0..9 27 | 28 | 29 | val bd1 = BigDecimal.ONE 30 | val bd2 = BigDecimal.ONE 31 | val bdbd = bd1 > bd2 32 | val bdeq = bd1 == bd2 33 | val bdeqeq = bd1 === bd2 34 | println(bdbd) // false 35 | println(bdeq) // true 36 | println(bdeqeq) // true 37 | 38 | val p1 = Point(1, 1) 39 | val p2 = Point(1, 1) 40 | val p3 = Point(1, 3) 41 | println(-p1) 42 | println(p1 == p2) // true 43 | println(p1 == p3) // false 44 | println(p1 >= p2) // true 45 | println(p3 > p1) // true 46 | 47 | } 48 | 49 | 50 | class Point(val x: Int, val y: Int) { 51 | override fun equals(other: Any?): Boolean { 52 | if (this === other) return true 53 | if (javaClass != other?.javaClass) return false 54 | 55 | other as Point 56 | 57 | if (x != other.x) return false 58 | if (y != other.y) return false 59 | 60 | return true 61 | } 62 | 63 | override fun hashCode(): Int { 64 | var result = x 65 | result = 31 * result + y 66 | return result 67 | } 68 | 69 | operator fun compareTo(other: Point): Int { 70 | val thisNorm = Math.sqrt((this.x * this.x + this.y * this.y).toDouble()) 71 | val otherNorm = Math.sqrt((other.x * other.x + other.y * other.y).toDouble()) 72 | return thisNorm.compareTo(otherNorm) 73 | } 74 | 75 | operator fun unaryMinus() = Point(-x, -y) 76 | override fun toString(): String { 77 | return "Point(x=$x, y=$y)" 78 | } 79 | 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/PrimaryTypesKt.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | fun main(args: Array) { 4 | test1() 5 | } 6 | 7 | fun test1() { 8 | val x: Int = 123 9 | val y: Int = 123 10 | 11 | println(x == y) 12 | println(x === y) 13 | 14 | val z: Int = 456 15 | val w: Int = 456 16 | println(z == w) 17 | println(z === w) 18 | 19 | val a: Long = 789 20 | val b: Int = 1010 21 | println(a.print() 26 | } 27 | 28 | override fun getMilestone() { 29 | println("M") 30 | } 31 | 32 | override fun save(project: Project): Project { 33 | return Project() 34 | } 35 | } 36 | 37 | fun main(args: Array) { 38 | // val projectService = ProjectService() 39 | val projectServiceImpl = ProjectServiceImpl("Kotlin Project", "Jack") 40 | println(projectServiceImpl is ProjectService) 41 | projectServiceImpl.save(Project()) 42 | projectServiceImpl.print() 43 | projectServiceImpl.getMilestone() 44 | } 45 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/ShapeDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | abstract class Shape { 4 | open var width: Double = 0.0 5 | open var heigth: Double = 0.0 6 | open var radius: Double = 0.0 7 | abstract fun area(): Double 8 | 9 | open fun onClick() { 10 | println("Shape is Clicked!") 11 | } 12 | } 13 | 14 | class Rectangle(override var width: Double, override var heigth: Double) : Shape() { 15 | override fun area(): Double { 16 | return width * heigth 17 | } 18 | } 19 | 20 | class Circle(override var radius: Double) : Shape() { 21 | override fun area(): Double { 22 | return Math.PI * radius * radius 23 | } 24 | 25 | override fun onClick() { 26 | println("${this::class.simpleName} is Clicked!") 27 | } 28 | } 29 | 30 | class Triangle(override var width: Double, override var heigth: Double) : Shape() { 31 | override fun area(): Double { 32 | return width * heigth / 2 33 | } 34 | } 35 | 36 | fun main(args: Array) { 37 | val rect = Rectangle(1.0, 2.0) 38 | println(rect is Shape) // true 39 | 40 | // val shape = Shape() // 抽象类是不能够被初始化的 41 | 42 | val circle = Circle(10.0) 43 | println(circle.area()) // 314.1592653589793 44 | circle.onClick() 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/annotation/AnnotationClassNote.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.annotation 10 | 11 | import java.util.* 12 | import kotlin.reflect.KClass 13 | import kotlin.reflect.full.declaredFunctions 14 | 15 | @Target(AnnotationTarget.CLASS, 16 | AnnotationTarget.FUNCTION, 17 | AnnotationTarget.VALUE_PARAMETER, 18 | AnnotationTarget.EXPRESSION) 19 | @Retention(AnnotationRetention.RUNTIME) 20 | @Repeatable 21 | @MustBeDocumented 22 | annotation class TestCase(val id: String) 23 | 24 | annotation class TestCasee(val id: Int) 25 | annotation class TestCaseee(val id: Array) 26 | annotation class TestCaseeee(val id: Run) 27 | annotation class TestCaseeeeee(val id: KClass) 28 | 29 | //annotation class TestCaseeeee(val id: Array) 30 | //annotation class TestCaseeeeee(val id: SwordTest) 31 | 32 | 33 | @Target(AnnotationTarget.CLASS, 34 | AnnotationTarget.FUNCTION, 35 | AnnotationTarget.VALUE_PARAMETER, 36 | AnnotationTarget.EXPRESSION) 37 | @Retention(AnnotationRetention.RUNTIME) 38 | @Repeatable 39 | @MustBeDocumented 40 | annotation class Run 41 | 42 | 43 | @Run 44 | class SwordTest { 45 | 46 | @TestCase(id = "1") 47 | fun testCase(testId: String) { 48 | println("Run SwordTest ID = ${testId}") 49 | } 50 | 51 | } 52 | 53 | 54 | fun main(args: Array) { 55 | // testAnno() 56 | testAnnoProcessing() 57 | } 58 | 59 | fun testAnnoProcessing() { 60 | val sword = SwordTest() 61 | val kClasss: KClass = sword::class 62 | val kClass = sword::class 63 | 64 | val declaredFunctions = kClass.declaredFunctions // 获取sword对象类型所声明的所有函数 65 | println(declaredFunctions) 66 | 67 | for (f in declaredFunctions) { 68 | // 处理 TestCase 注解,使用其中的元数据 69 | f.annotations.forEach { 70 | if (it is TestCase) { 71 | val id = it.id 72 | doSomething(id) // 注解处理逻辑 73 | f.call(sword, id) // 等价于 f.javaMethod?.invoke(sword, id) 74 | // f.javaMethod?.invoke(sword, id) 75 | } 76 | } 77 | } 78 | } 79 | 80 | private fun doSomething(id: String) { 81 | println("Do Something in Annotation Processing ${id} ${Date()} ") 82 | } 83 | 84 | fun testAnno() { 85 | val sword = SwordTest() 86 | sword::class.annotations.forEach { 87 | println(it) 88 | } 89 | 90 | val declaredFunctions = sword::class.declaredFunctions // 获取note对象类型所声明的所有函数 91 | println(declaredFunctions) 92 | 93 | declaredFunctions.forEach { 94 | // 处理 TestCase 注解,使用其中的元数据 95 | it.annotations.forEach { 96 | if (it is TestCase) { 97 | val id = it.id 98 | println("id = $id") 99 | 100 | val qualifiedName = it.annotationClass.qualifiedName // TestCase注解的全路径限定名 101 | println("qualifiedName = $qualifiedName") 102 | 103 | val simpleName = it.annotationClass.simpleName // TestCase注解的简单类名 104 | println("simpleName = $simpleName") 105 | } 106 | } 107 | 108 | println("成员函数: ${it.name}") 109 | it.parameters.forEach { 110 | println("函数入参: ${it.name}") 111 | } 112 | 113 | 114 | } 115 | } 116 | 117 | annotation class AnnoX(val value: String) 118 | 119 | annotation class AnnoY( 120 | val message: String, 121 | val annoX: AnnoX = AnnoX("X")) 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch01/EasyKotlinDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch01 10 | 11 | import java.text.SimpleDateFormat 12 | import java.util.* 13 | 14 | data class PersonKotlin(val id: Int, val name: String) 15 | 16 | fun getArrayList(): List { // (1) 17 | val arrayList = ArrayList() // (2) 18 | arrayList.add("A") 19 | arrayList.add("B") 20 | arrayList.add("C") 21 | return arrayList 22 | } 23 | 24 | 25 | fun String.firstChar(): String { // 给 String 类扩展一个firstChar() 函数 26 | if (this.length == 0) { 27 | return "" 28 | } 29 | return this[0].toString() 30 | } 31 | 32 | 33 | fun main(args: Array) { 34 | println("Hello, world!") 35 | println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())) 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch01/HelloWorld.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch01 10 | 11 | fun main(args: Array) { 12 | println("Hello,World!") 13 | } 14 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch01/HttpClient.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch01 10 | 11 | import okhttp3.* 12 | import java.io.IOException 13 | import java.util.concurrent.TimeUnit 14 | 15 | 16 | fun main(args: Array) { 17 | val hasRunningInstanceApi = "http://h5agent.alibaba.net/hasRunningInstance" 18 | val runApi = "http://h5agent.alibaba.net/run?timestamp=2000000000000&url=http://www.baidu.com" 19 | val runApiIP = "http://h5agent.alibaba.net/run?timestamp=2000000000000&url=http://www.baidu.com" 20 | // getAsync(hasRunningInstanceApi) 21 | // getAsync(runApi) 22 | // getAsync(runApiIP) 23 | get(hasRunningInstanceApi) 24 | // get(runApi) 25 | // get(runApiIP) 26 | } 27 | 28 | fun get(url: String): String? { 29 | var result: String? = "" 30 | val okhttp = OkHttpClient.Builder() 31 | .connectTimeout(10, TimeUnit.MINUTES) 32 | .readTimeout(10, TimeUnit.MINUTES) 33 | .writeTimeout(10, TimeUnit.MINUTES) 34 | .build() 35 | 36 | val request = Request.Builder() 37 | .url(url) 38 | .addHeader("Connection", "close") 39 | .build() 40 | 41 | val call = okhttp.newCall(request) 42 | 43 | try { 44 | val response = call.execute() 45 | result = response.body()?.string() 46 | println(result) 47 | 48 | } catch (e: IOException) { 49 | e.printStackTrace() 50 | } 51 | 52 | return result 53 | } 54 | 55 | 56 | fun getAsync(url: String) { 57 | val okhttp = OkHttpClient.Builder() 58 | .connectTimeout(10, TimeUnit.MINUTES) 59 | .readTimeout(10, TimeUnit.MINUTES) 60 | .writeTimeout(10, TimeUnit.MINUTES) 61 | .build() 62 | 63 | val request = Request.Builder() 64 | .url(url) 65 | .build() 66 | 67 | val call = okhttp.newCall(request) 68 | 69 | call.enqueue(object : Callback { 70 | override fun onFailure(call: Call, e: IOException) { 71 | println(e.message) 72 | e.printStackTrace() 73 | } 74 | 75 | override fun onResponse(call: Call, response: Response) { 76 | try { 77 | val result = response.body()?.string() 78 | println(result) 79 | } catch (e: IOException) { 80 | println("response = ${response}") 81 | e.printStackTrace() 82 | } 83 | } 84 | }) 85 | 86 | } 87 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch01/KotlinCheatSheet.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch01 10 | 11 | fun main(args: Array) { 12 | // println("Hello,World") 13 | // println(isLeapYear(2017)) 14 | // println(isLeapYear(2020)) 15 | // casesWhen(1) 16 | // casesWhen("hello") 17 | // casesWhen('X') 18 | // casesWhen(null) 19 | // println(fact(10)) 20 | println(sumFact(10)) 21 | } 22 | 23 | fun isLeapYear(year: Int): Boolean { 24 | var isLeapYear: Boolean 25 | if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { 26 | isLeapYear = true 27 | } else { 28 | isLeapYear = false 29 | } 30 | return isLeapYear 31 | } 32 | 33 | fun casesWhen(obj: Any?) { 34 | when (obj) { 35 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 -> println("${obj} ===> 这是一个0-9之间的数字") 36 | "hello" -> println("${obj} ===> 这个是字符串hello") 37 | is Char -> println("${obj} ===> 这是一个 Char 类型数据") 38 | else -> println("${obj} ===> else类似于Java中的 case-switch 中的 default") 39 | } 40 | var x = 10 41 | when{ 42 | x in 6..10 -> println("大于6小于等于10") 43 | x < 6 -> println("小于6") 44 | else -> println("其他") 45 | } 46 | } 47 | 48 | //编写一个 Kotlin 程序在屏幕上输出1!+2!+3!+……+10!的和 49 | fun sumFact(n: Int): Int { 50 | var sum = 0 51 | for (i in 1..n) { 52 | sum += fact(i) 53 | } 54 | return sum 55 | } 56 | 57 | 58 | fun fact(n: Int): Int { 59 | var result = 1 60 | when (n) { 61 | 0, 1 -> result = 1 62 | else -> result = n * fact(n - 1) 63 | } 64 | return result 65 | } 66 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch02/EasyKotlinDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch02 10 | 11 | import java.lang.Integer.parseInt 12 | 13 | fun main(args: Array) { 14 | println(max(1, 2)) 15 | println(isLeapYear(2017)) // false 16 | println(isLeapYear(2020)) // true 17 | 18 | casesWhen(1) 19 | casesWhen("hello") 20 | casesWhen('X') 21 | casesWhen(null) 22 | } 23 | 24 | fun casesWhen(obj: Any?) { 25 | when (obj) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 -> println("${obj} ===> 这是一个0-9之间的数字") 26 | "hello" -> println("${obj} ===> 这个是字符串hello") 27 | is Char -> println("${obj} ===> 这是一个 Char 类型数据") 28 | else -> println("${obj} ===> else类似于Java中的 case-switch 中的 default") 29 | } 30 | } 31 | 32 | fun isLeapYear(year: Int): Boolean { 33 | var isLeapYear: Boolean 34 | if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { 35 | isLeapYear = true 36 | } else { 37 | isLeapYear = false 38 | } 39 | return isLeapYear 40 | } 41 | 42 | 43 | fun max(a: Int, b: Int): Int { // 表达式返回值 44 | val max = if (a > b) a else b 45 | return max 46 | } 47 | 48 | fun max3(a: Int, b: Int): Int { 49 | val max = if (a > b) { 50 | print("Max is a") 51 | a // 最后的表达式作为该代码块的值 52 | 53 | } else { 54 | print("Max is b") 55 | b // 同上 56 | } 57 | return max 58 | } 59 | 60 | 61 | fun switch(x: Int) { 62 | val s = "123" 63 | when (x) { -1, 0 -> print("x == -1 or x == 0") 64 | 1 -> print("x == 1") 65 | 2 -> print("x == 2") 66 | 8 -> print("x is 8") 67 | parseInt(s) -> println("x is 123") 68 | else -> { // 注意这个块 69 | print("x is neither 1 nor 2") 70 | } 71 | } 72 | } 73 | 74 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch02/PrimaryTypesKt.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch02 10 | 11 | fun main(args: Array) { 12 | test1() 13 | } 14 | 15 | fun test1() { 16 | val x: Int = 123 17 | val y: Int = 123 18 | 19 | println(x == y) 20 | println(x === y) 21 | 22 | val z: Int = 456 23 | val w: Int = 456 24 | println(z == w) 25 | println(z === w) 26 | 27 | val a: Long = 789 28 | val b: Int = 1010 29 | println(a list[index] = i * i } 17 | println(list) 18 | } 19 | 20 | 21 | fun letFun() { 22 | val listWithNulls = listOf("A", "B", "C", null, null, "D") 23 | listWithNulls.forEach { it?.let { println(it) } } 24 | } 25 | 26 | fun main(args: Array) { 27 | println(Date()) 28 | forEachIndexedTest() 29 | letFun() 30 | } 31 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch03/NonNullableType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch03 10 | 11 | 12 | fun main(args: Array) { 13 | val a = "abc" 14 | a.length 15 | val b: String? = null 16 | b?.length 17 | } 18 | 19 | /** 20 | * Kotlin 与 Java 完全无缝互操作 21 | */ 22 | fun getArrayList(): List { 23 | val arrayList = ArrayList() 24 | arrayList.add("A") 25 | arrayList.add("B") 26 | arrayList.add("C") 27 | return arrayList 28 | } 29 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/AbstractClassDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | abstract class Shape { 12 | abstract var width: Double 13 | abstract var heigth: Double 14 | abstract var radius: Double 15 | abstract fun area(): Double 16 | 17 | open fun onClick() { 18 | println("I am Clicked!") 19 | } 20 | } 21 | 22 | class Rectangle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 23 | override fun area(): Double { 24 | return heigth * width 25 | } 26 | 27 | override fun onClick() { 28 | println("${this::class.simpleName} is Clicked!") 29 | } 30 | } 31 | 32 | class Circle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 33 | override fun area(): Double { 34 | return 3.14 * radius * radius 35 | } 36 | } 37 | 38 | class Triangle(override var width: Double, override var heigth: Double, override var radius: Double) : Shape() { 39 | override fun area(): Double { 40 | return width * heigth / 2 41 | } 42 | } 43 | 44 | 45 | fun main(args: Array) { 46 | //val s = Shape() // 编译不通过!不能实例化抽象类 47 | val r = Rectangle(3.0, 4.0, 0.0) 48 | println(r.area()) 49 | r.onClick() 50 | 51 | // println(r is Shape) 52 | 53 | val c = Circle(0.0, 0.0, 4.0) 54 | println(c.area()) 55 | c.onClick() 56 | } 57 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/ClassDeclaration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | class ClassDeclaration 12 | 13 | class AnEmptyClass 14 | 15 | fun main(args: Array) { 16 | val anEmptyClass = AnEmptyClass() 17 | println(anEmptyClass) 18 | println(anEmptyClass is AnEmptyClass) 19 | println(anEmptyClass::class) 20 | 21 | val person = Person("Jack", 29, "M") 22 | println("person = ${person}") 23 | 24 | val person1 = Person1() 25 | person1.name = "Jack" 26 | person1.age = 29 27 | person1.sex = "M" 28 | println("person1 = ${person1}") 29 | 30 | val person21 = Person2() 31 | person21.name = "Jack" 32 | person21.age = 29 33 | person21.sex = "M" 34 | println("person21 = ${person21}") 35 | 36 | val person22 = Person2("Jack", 29) 37 | person22.sex = "M" 38 | println("person22 = ${person22}") 39 | 40 | val person23 = Person2("Jack", 29, "M") 41 | println("person23 = ${person23}") 42 | } 43 | 44 | class Person(var name: String, var age: Int, var sex: String) { // 一种简洁语法,可以通过主构造器来定义属性并初始化属性值(可以是var或val) 45 | override fun toString(): String { 46 | return "Person(name='$name', age=$age, sex='$sex')" 47 | } 48 | } 49 | 50 | class Person1 { 51 | lateinit var name: String 52 | var age: Int = 0 53 | lateinit var sex: String 54 | override fun toString(): String { 55 | return "Person1(name='$name', age=$age, sex='$sex')" 56 | } 57 | } 58 | 59 | class Person2 { 60 | lateinit var name: String 61 | var age: Int = 0 62 | lateinit var sex: String 63 | 64 | constructor() 65 | 66 | constructor(name: String) { 67 | this.name = name 68 | } 69 | 70 | constructor(name: String, age: Int) : this(name) { 71 | this.name = name 72 | this.age = age 73 | } 74 | 75 | constructor(name: String, age: Int, sex: String) : this(name, age) { 76 | this.name = name 77 | this.age = age 78 | this.sex = sex 79 | } 80 | 81 | override fun toString(): String { 82 | return "Person1(name='$name', age=$age, sex='$sex')" 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/DataClass.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | data class PersonKotlin(val id: Int, val name: String) 12 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/DataClassDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | data class LoginUser(val username: String, val password: String) 4 | 5 | interface DataInterface 6 | 7 | data class LoginUser2(var username: String, var password: String) : DataInterface { 8 | 9 | } 10 | 11 | 12 | data class DataEmpty(var param: String) // 数据类至少有1个参数 13 | //data class DataClassDemoPPP(param: String) // 数据类至少有1个参数 14 | 15 | 16 | 17 | fun main(args: Array) { 18 | val loginUser = LoginUser("root", "111111") 19 | 20 | println(loginUser) 21 | println(loginUser.username) 22 | println(loginUser.password) 23 | 24 | println(loginUser.component1()) 25 | println(loginUser.component2()) 26 | 27 | val (username, password) = loginUser // 解构声明 28 | println("username = ${username}") 29 | println("password = ${password}") 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/EnumClassDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | 12 | enum class Direction { 13 | NORTH, SOUTH, WEST, EAST // 每个枚举常量都是一个对象, 用逗号分隔 14 | } 15 | 16 | 17 | enum class Color(val rgb: Int) { 18 | RED(0xFF0000), 19 | GREEN(0x00FF00), 20 | BLUE(0x0000FF) 21 | } 22 | 23 | fun main(args: Array) { 24 | val east = Direction.EAST 25 | println(east.name) 26 | println(east.ordinal) 27 | 28 | println(Direction.NORTH.name) 29 | println(Direction.NORTH.ordinal) 30 | 31 | val c = Color.GREEN 32 | println(c.rgb) 33 | println(c.name) 34 | println(c.ordinal) 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/HTMLParser.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch04 10 | 11 | import org.jsoup.Jsoup 12 | import org.jsoup.nodes.Element 13 | import org.jsoup.select.Elements 14 | import java.net.URL 15 | 16 | object HTMLParser { 17 | fun getElementsByAttributeValue(html: String, attribute: String, name: String): Elements { 18 | val document = Jsoup.parse(html) 19 | return document.html(html).getElementsByAttributeValue(attribute, name) 20 | } 21 | 22 | fun getElementsByClass(html: String, className: String, name: String): Elements { 23 | val document = Jsoup.parse(html) 24 | return document.html(html).getElementsByClass(className) 25 | } 26 | 27 | fun getElementsByTag(html: String, tagName: String): Elements { 28 | val document = Jsoup.parse(html) 29 | return document.html(html).getElementsByTag(tagName) 30 | } 31 | 32 | fun getElementsById(html: String, id: String): Element { 33 | val document = Jsoup.parse(html) 34 | return document.html(html).getElementById(id) 35 | } 36 | 37 | 38 | } 39 | 40 | fun main(args: Array) { 41 | val url = URL("https://www.baidu.com/") 42 | val html = url.readText() 43 | 44 | //document.getElementsByTagName("title")[0].innerHTML 45 | val elements = HTMLParser.getElementsByTag(html, "title") 46 | elements.eachText().forEach { println(it) } 47 | 48 | val form = HTMLParser.getElementsById(html, "form") 49 | form.allElements.forEach { 50 | println(it.html()) 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/HelloOOP.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | class HelloOOP { 12 | 13 | } 14 | 15 | 16 | class Empty 17 | 18 | 19 | fun main(args: Array) { 20 | val empty = Empty() 21 | println(empty) 22 | } 23 | 24 | 25 | class Employee(val name: String, val workno: String, val sex: String, val age: Int) { 26 | override fun toString(): String { 27 | return "Employee(name='$name', workno='$workno', sex='$sex', age=$age)" 28 | } 29 | } 30 | 31 | 32 | class Department { 33 | var deptNo: Int = 0 34 | lateinit var deptName: String 35 | 36 | override fun toString(): String { 37 | return "Department(deptNo=$deptNo, deptName='$deptName')" 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/ObjectDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | object StringUtilKt { 4 | fun isEmpty(str: String): Boolean { 5 | return str.trim() == "" 6 | } 7 | } 8 | 9 | fun main(args: Array) { 10 | val b = StringUtilKt.isEmpty("") 11 | println(b) 12 | 13 | val p = DataProcessor() 14 | p.processHTML() 15 | p.processJSON() 16 | // p.processText() 17 | DataProcessor.processText() 18 | 19 | } 20 | 21 | 22 | class DataProcessor { 23 | fun processJSON() { 24 | println("Process JSON") 25 | } 26 | 27 | fun processHTML() { 28 | println("Process HTML") 29 | } 30 | 31 | companion object { // 伴生对象 32 | fun processText() { 33 | println("Process Text") 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/ProjectService.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | class Project 4 | 5 | interface ProjectService { 6 | var name: String 7 | var owner: String 8 | fun save(project: Project): Project 9 | fun print() { 10 | println("P") 11 | } 12 | } 13 | 14 | 15 | interface MilestoneService { 16 | fun getMilestone() 17 | fun print() { 18 | println("PPP") 19 | } 20 | } 21 | 22 | class ProjectServiceImpl(override var name: String, override var owner: String) : ProjectService, MilestoneService { 23 | override fun print() { 24 | // super.print() 25 | super.print() 26 | } 27 | 28 | override fun getMilestone() { 29 | println("M") 30 | } 31 | 32 | override fun save(project: Project): Project { 33 | return Project() 34 | } 35 | } 36 | 37 | fun main(args: Array) { 38 | // val projectService = ProjectService() 39 | val projectServiceImpl = ProjectServiceImpl("Kotlin Project", "Jack") 40 | println(projectServiceImpl is ProjectService) 41 | projectServiceImpl.save(Project()) 42 | projectServiceImpl.print() 43 | projectServiceImpl.getMilestone() 44 | } 45 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch04/ShapeDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin 2 | 3 | abstract class Shape { 4 | open var width: Double = 0.0 5 | open var heigth: Double = 0.0 6 | open var radius: Double = 0.0 7 | abstract fun area(): Double 8 | 9 | open fun onClick() { 10 | println("Shape is Clicked!") 11 | } 12 | } 13 | 14 | class Rectangle(override var width: Double, override var heigth: Double) : Shape() { 15 | override fun area(): Double { 16 | return width * heigth 17 | } 18 | } 19 | 20 | class Circle(override var radius: Double) : Shape() { 21 | override fun area(): Double { 22 | return Math.PI * radius * radius 23 | } 24 | 25 | override fun onClick() { 26 | println("${this::class.simpleName} is Clicked!") 27 | } 28 | } 29 | 30 | class Triangle(override var width: Double, override var heigth: Double) : Shape() { 31 | override fun area(): Double { 32 | return width * heigth / 2 33 | } 34 | } 35 | 36 | fun main(args: Array) { 37 | val rect = Rectangle(1.0, 2.0) 38 | println(rect is Shape) // true 39 | 40 | // val shape = Shape() // 抽象类是不能够被初始化的 41 | 42 | val circle = Circle(10.0) 43 | println(circle.area()) // 314.1592653589793 44 | circle.onClick() 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/FunAlsoDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | fun testAlsoFun() { 12 | val a = "ABC".also { 13 | println(it) // ABC 14 | } 15 | println(a) // ABC 16 | a.let { 17 | println(it) // ABC 18 | } 19 | } 20 | 21 | fun main(args: Array) { 22 | testAlsoFun() 23 | } 24 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/FunApplyDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | fun testApply() { 12 | // 普通写法 13 | val list = mutableListOf() 14 | list.add("A") 15 | list.add("B") 16 | list.add("C") 17 | println("普通写法 list = $list") // 常规写法 list = [A, B, C] 18 | println(list) 19 | 20 | // 使用 apply 函数写法 21 | val a = ArrayList().apply { 22 | add("A") 23 | add("B") 24 | add("C") 25 | println("使用 apply 函数写法 this = $this") 26 | } 27 | println(a) 28 | // 等价于 29 | a.let { println(it) } 30 | } 31 | 32 | fun main(args: Array) { 33 | testApply() 34 | } 35 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/FunLetDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | fun myfun(): String { 12 | println("执行了 myfun 函数") 13 | return "这是 myfun 的返回值" 14 | } 15 | 16 | fun testLetFun() { 17 | 1.let { println(it) } // 1 18 | "ABC".let { println(it) } // ABC 19 | // 执行完函数 myfun(), 返回值传给 let 函数 20 | myfun().let { 21 | print(it) 22 | } 23 | } 24 | 25 | fun main(args: Array) { 26 | testLetFun() 27 | } 28 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/FunRunDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | 12 | fun testRunFun() { 13 | myfun() 14 | run({ myfun() }) 15 | run { myfun() } 16 | run { println("A") } 17 | } 18 | 19 | fun main(args: Array) { 20 | testRunFun() 21 | } 22 | 23 | /* 输出: 24 | 25 | 执行了 myfun 函数 26 | 执行了 myfun 函数 27 | 执行了 myfun 函数 28 | A 29 | 30 | */ 31 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/FunWithDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | fun testWithFun() { 12 | // 普通写法 13 | val list = mutableListOf() 14 | list.add("A") 15 | list.add("B") 16 | list.add("C") 17 | println("常规写法 list = $list") // 常规写法 list = [A, B, C] 18 | 19 | // 使用 with 函数写法 20 | with(ArrayList()) { 21 | add("A") 22 | add("B") 23 | add("C") 24 | println("使用 with 函数写法 this = $this") // 使用 with 函数的写法 this = [A, B, C] 25 | }.let { 26 | println(it) // kotlin.Unit 27 | } 28 | } 29 | 30 | fun main(args: Array) { 31 | testWithFun() 32 | } 33 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch05/HigherOrderFunction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | // http://www.jianshu.com/p/61db795324bd 12 | // 简单好用的 Kotlin 类型别名, 我们使用 G,F,H 声明了3个函数类型(有点类似Java 中的接口类型的概念) 13 | typealias G = (String) -> Int 14 | typealias F = (Int) -> Boolean 15 | typealias H = (String) -> Boolean 16 | 17 | fun main(args: Array) { 18 | val strList = listOf("a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg") 19 | // 非常好用的流式 API filter,flat,map 等等 20 | val mstrList = strList.filter(h(g, f)) 21 | println(mstrList) 22 | 23 | 24 | mstrList.forEachIndexed { index, value -> 25 | println("$value = ${value.length}") 26 | } 27 | 28 | println(foo(1, { it -> it + 1 })) 29 | println(foo(10, { it -> it * it })) 30 | } 31 | 32 | // 简单直接的函数定义 33 | val f = fun(x: Int) = x % 2 == 1 // 判断输入的Int是否奇数 34 | val g = fun(s: String) = s.length // 返回输入的字符串参数的长度 35 | // 简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*)) 36 | val h = fun(g: G, f: F): H { 37 | return { f(g(it)) } 38 | } 39 | 40 | 41 | fun foo(x: Int = 1, transform: (Int) -> T = { it as T }) = transform(x) 42 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch06/ExtensionsDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch06 10 | 11 | import com.easy.kotlin.firstChar 12 | import com.easy.kotlin.lastChar 13 | 14 | fun main(args: Array) { 15 | val str = "abc" 16 | str.firstChar() 17 | str.lastChar() 18 | } 19 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch07/CollectionsDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | fun main(args: Array) { 12 | val emptyList: List = listOf() 13 | val emptySet: Set = setOf() 14 | val emptyMap: Map = mapOf() 15 | 16 | val list = listOf(1, 2, 3, 4, 5, 6, 7) 17 | val mutableList = mutableListOf("a", "b", "c") 18 | 19 | val set = setOf(1, 2, 3, 4, 5, 6, 7) 20 | val mutableSet = mutableSetOf("a", "b", "c") 21 | 22 | val map = mapOf(1 to "a", 2 to "b", 3 to "c") 23 | val mutableMap = mutableMapOf(1 to "X", 2 to "Y", 3 to "Z") 24 | 25 | 26 | 27 | list.forEach { 28 | println(it) 29 | } 30 | 31 | 32 | set.forEach { 33 | println(it) 34 | } 35 | 36 | 37 | map.forEach { 38 | println("K = ${it.key}, V = ${it.value}") 39 | } 40 | 41 | 42 | 43 | list.forEachIndexed { index, value -> 44 | println("list index = ${index} , value = ${value}") 45 | } 46 | 47 | set.forEachIndexed { index, value -> 48 | println("set index = ${index} , value = ${value}") 49 | } 50 | 51 | mutableList.forEach { 52 | println(it) 53 | } 54 | 55 | val result1 = list.filter { it % 2 == 1 } 56 | 57 | val funlist: List<(Int) -> Boolean> = 58 | listOf({ it -> it % 2 == 0 }, 59 | { it -> it % 2 == 1 }) 60 | 61 | val result2 = list.filter(funlist[0]) 62 | val result3 = list.filter(funlist[1]) 63 | 64 | println("result1 = ${result1}") 65 | println("result2 = ${result2}") 66 | println("result3 = ${result3}") 67 | 68 | list.filterIndexed { index, it -> index % 2 == 0 && it > 3 } 69 | 70 | 71 | list.map { it * it } // [1, 4, 9, 16, 25, 36, 49] 72 | set.map { it + 1 } // [2, 3, 4, 5, 6, 7, 8] 73 | map.map { it.value + "$" } // [a$, b$, c$] 74 | 75 | val strlist = listOf("a", "b", "c") 76 | println(strlist.map { it -> listOf(it + 1, it + 2, it + 3, it + 4) }) 77 | println(strlist.map { it -> listOf(it + 1, it + 2, it + 3, it + 4) }.flatten()) 78 | println(strlist.flatMap { it -> listOf(it + 1, it + 2, it + 3, it + 4) }) 79 | 80 | val studentList = listOf( 81 | Student(1, "Jack", 18, 90), 82 | Student(2, "Rose", 17, 80), 83 | Student(3, "Alice", 16, 70) 84 | ) 85 | println(studentList.filter { it.age >= 18 }) 86 | println(studentList.filter { it.score < 80 }) 87 | 88 | 89 | val dupList = listOf(1, 1, 2, 2, 3, 3, 3) 90 | println(dupList.distinct()) // [1, 2, 3] 91 | 92 | } 93 | 94 | fun orderFun(){ 95 | val list = listOf(1, 2, 3, 4, 5, 6, 7) 96 | val set = setOf(1,3,2) 97 | 98 | list.reversed() // [7, 6, 5, 4, 3, 2, 1] 99 | set.reversed() // [2, 3, 1] 100 | 101 | list.sorted() 102 | set.sorted() 103 | } 104 | 105 | 106 | data class Student(var id: Long, var name: String, var age: Int, var score: Int) { 107 | override fun toString(): String { 108 | return "Student(id=$id, name='$name', age=$age, score=$score)" 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch08/GenericTypeDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | import java.util.* 12 | 13 | val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c") 14 | 15 | open class Food 16 | open class Fruit : Food() 17 | class Apple : Fruit() 18 | class Banana : Fruit() 19 | class Grape : Fruit() 20 | 21 | 22 | object GenericTypeDemo { 23 | 24 | fun addFruit(fruit: MutableList) { 25 | // TODO 26 | } 27 | 28 | fun getFruit(fruit: MutableList) { 29 | // TODO 30 | } 31 | 32 | fun addApple(apple: MutableList) { 33 | // TODO 34 | } 35 | 36 | fun getApple(apple: MutableList) { 37 | // TODO 38 | } 39 | 40 | } 41 | 42 | fun main(args: Array) { 43 | val fruits: MutableList = mutableListOf(Fruit(), Fruit(), Fruit()) 44 | GenericTypeDemo.addFruit(fruits) 45 | GenericTypeDemo.getFruit(fruits) 46 | 47 | val apples: MutableList = mutableListOf(Apple(), Apple(), Apple()) 48 | // GenericTypeDemo.addFruit(apples) // type mismatch 49 | // GenericTypeDemo.getFruit(apples) // type mismatch 50 | GenericTypeDemo.addApple(apples) 51 | GenericTypeDemo.getApple(apples) 52 | 53 | testContainer() 54 | testGenerator() 55 | testGenericClass() 56 | 57 | 58 | // MutableList::class 59 | MutableList::class 60 | } 61 | 62 | //泛型类 63 | class Container(var key: K, var value: V) { 64 | override fun toString(): String { 65 | return "Container(key=$key, value=$value)" 66 | } 67 | } 68 | 69 | fun testContainer() { 70 | val container = Container(1, "A") 71 | println("container = ${container}") 72 | } 73 | 74 | //泛型接口 75 | interface Generator { 76 | operator fun next(): T 77 | } 78 | 79 | fun testGenerator() { 80 | val gen = object : Generator { 81 | override fun next(): Int { 82 | return Random().nextInt(10) 83 | } 84 | } 85 | println(gen.next()) 86 | } 87 | 88 | 89 | // 泛型方法 90 | class GenericClass { 91 | fun console(t: T) { 92 | println(t) 93 | } 94 | } 95 | 96 | interface GenericInterface { 97 | fun console(t: T) 98 | } 99 | 100 | fun > gt(x: T, y: T): Boolean { 101 | return x > y 102 | } 103 | 104 | //fun gt1(x: T, y: T): Boolean { 105 | // return x > y // 编译不通过 106 | //} 107 | 108 | 109 | fun testGenericClass() { 110 | val gen = GenericClass() 111 | gen.console("X") 112 | } 113 | 114 | 115 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch08/GenericTypeDemoOutIn.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter 10 | 11 | 12 | fun main(args: Array) { 13 | val fruits: MutableList = mutableListOf(Fruit(), Fruit(), Fruit()) 14 | GenericTypeDemoOutIn.addFruit(fruits) 15 | GenericTypeDemoOutIn.getFruit(fruits) 16 | 17 | val apples: MutableList = mutableListOf(Apple(), Apple(), Apple()) 18 | GenericTypeDemoOutIn.getFruit(apples) 19 | // GenericTypeDemoOutIn.addFruit(apples) // type mismatch, 只能传入Fruit类型及其超类型 20 | 21 | val foods: MutableList = mutableListOf(Food(), Food(), Food()) 22 | GenericTypeDemoOutIn.addFruit(foods) 23 | // GenericTypeDemoOutIn.getFruit(foods) // type mismatch, 只能传入Fruit类型及其超类型 24 | } 25 | 26 | object GenericTypeDemoOutIn { 27 | 28 | fun addFruit(superFruit: MutableList) { // 29 | // superFruit 限制为只能传入 Fruit 类型及其父类型, 30 | // 这样我们就可以安全地向superFruit 添加 Fruit 类型了。 31 | superFruit.add(Fruit()) 32 | superFruit.add(Apple()) 33 | superFruit.add(Banana()) 34 | superFruit.add(Grape()) 35 | // superFruit.add(Food()) // Type mismatch,不能放入 Fruit 的超类型 36 | println("superFruit = ${superFruit}") 37 | 38 | // val f0: Fruit = superFruit[0] // Any? , Type mismatch 39 | // val f1: Fruit = superFruit[1] // Any? , Type mismatch 40 | 41 | } 42 | 43 | fun getFruit(extendsFruit: MutableList) { // 44 | // extendsFruit 传入的可能为 MutableList , 45 | // 也可能为 MutableList , 46 | // 也可能为 MutableList , 47 | // 也可能为 MutableList 等等,所以我们不能向 extendsFruit 中写入 Fruit(),Apple()对象, 48 | // 因为编译器不知道会传入什么样的 fruit 类型 49 | 50 | // extendsFruit.add(Fruit()) // out 投射类型, 禁止使用 add 51 | // extendsFruit.add(Apple()) // out 投射类型, 禁止使用 add 52 | extendsFruit.forEach { println(it) } 53 | } 54 | 55 | } 56 | 57 | 58 | fun countGreaterThan(elements: Array, target: T): Int { 59 | var count = 0 60 | for (e in elements){ 61 | // if (e > target) {// 编译不通过,除了 Short, Int 等原始类型,其他的类并不一定重载了操作符 > 62 | // ++count 63 | // } 64 | } 65 | 66 | return count 67 | } 68 | 69 | interface Comparable { 70 | operator fun compareTo(o: T): Int 71 | } 72 | 73 | fun > countGreaterThan(elements: Array, target: T): Int { // T : Comparable ,其中 Comparable 是类型 T 的上界 74 | // 也就是告诉编译器,类型参数 T 代表的都是实现了 Comparable 接口的类,这样等于告诉编译器它们都实现了compareTo方法。 75 | var count = 0 76 | for (e in elements){ 77 | if (e > target) { 78 | ++count 79 | } 80 | } 81 | 82 | return count 83 | } 84 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch09/FileIODemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch09 10 | 11 | import java.io.File 12 | import java.net.URL 13 | import java.nio.charset.Charset 14 | 15 | fun getUrlContent(url: String): String { 16 | return URL(url).readText(Charset.defaultCharset()) 17 | } 18 | 19 | fun getUrlBytes(url: String): ByteArray { 20 | return URL(url).readBytes() 21 | } 22 | 23 | fun writeUrlBytesTo(filename: String, url: String) { 24 | val bytes = URL(url).readBytes() 25 | File(filename).writeBytes(bytes) 26 | } 27 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch10/EasyKotlinDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch10 10 | 11 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch11/EasyKotlinDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch11 10 | 11 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch11/OperatorOverloadDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch11 10 | 11 | import java.math.BigDecimal 12 | 13 | class BoxInt(var i: Int) { 14 | 15 | operator fun times(x: BoxInt) = BoxInt(i * x.i) 16 | 17 | override fun toString(): String { 18 | return i.toString() 19 | } 20 | } 21 | 22 | operator fun BoxInt.plus(x: BoxInt) = BoxInt(this.i + x.i) 23 | 24 | fun main(arg: Array) { 25 | val a = BoxInt(3) 26 | val b = BoxInt(7) 27 | 28 | a + b 29 | a * b 30 | 31 | println(a + b) //10 32 | println(a * b) //21 33 | 34 | 1 in 0..9 35 | 36 | 37 | val bd1 = BigDecimal.ONE 38 | val bd2 = BigDecimal.ONE 39 | val bdbd = bd1 > bd2 40 | val bdeq = bd1 == bd2 41 | val bdeqeq = bd1 === bd2 42 | println(bdbd) // false 43 | println(bdeq) // true 44 | println(bdeqeq) // true 45 | 46 | val p1 = Point(1, 1) 47 | val p2 = Point(1, 1) 48 | val p3 = Point(1, 3) 49 | println(-p1) 50 | println(p1 == p2) // true 51 | println(p1 == p3) // false 52 | println(p1 >= p2) // true 53 | println(p3 > p1) // true 54 | 55 | } 56 | 57 | 58 | class Point(val x: Int, val y: Int) { 59 | override fun equals(other: Any?): Boolean { 60 | if (this === other) return true 61 | if (javaClass != other?.javaClass) return false 62 | 63 | other as Point 64 | 65 | if (x != other.x) return false 66 | if (y != other.y) return false 67 | 68 | return true 69 | } 70 | 71 | override fun hashCode(): Int { 72 | var result = x 73 | result = 31 * result + y 74 | return result 75 | } 76 | 77 | operator fun compareTo(other: Point): Int { 78 | val thisNorm = Math.sqrt((this.x * this.x + this.y * this.y).toDouble()) 79 | val otherNorm = Math.sqrt((other.x * other.x + other.y * other.y).toDouble()) 80 | return thisNorm.compareTo(otherNorm) 81 | } 82 | 83 | operator fun unaryMinus() = Point(-x, -y) 84 | override fun toString(): String { 85 | return "Point(x=$x, y=$y)" 86 | } 87 | 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch12/EasyKotlinDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch12 10 | 11 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/chapter/ch12/ReflectionDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.chapter.ch12 10 | 11 | import java.lang.reflect.ParameterizedType 12 | import kotlin.reflect.KTypeParameter 13 | import kotlin.reflect.full.declaredFunctions 14 | 15 | open class BaseContainer 16 | 17 | class Container> : BaseContainer { 18 | var elements: MutableList 19 | 20 | constructor(elements: MutableList) { 21 | this.elements = elements 22 | } 23 | 24 | fun sort(): Container { 25 | elements.sort() 26 | return this 27 | } 28 | 29 | override fun toString(): String { 30 | return "Container(elements=$elements)" 31 | } 32 | } 33 | 34 | 35 | fun fooContainer() { 36 | val container = Container(mutableListOf(1, 3, 2, 5, 4, 7, 6)) 37 | println(container) 38 | container.sort() 39 | println(container) 40 | 41 | val kClass = container::class // 获取KClass对象 42 | 43 | val jkCLass = kClass.java 44 | println(jkCLass) 45 | // val staticKClass = Container::class 46 | // println(staticKClass) 47 | 48 | val typeParameters = kClass.typeParameters // 获取类型参数typeParameters信息,也即泛型信息 49 | 50 | val kTypeParameter: KTypeParameter = typeParameters[0] 51 | println(kTypeParameter.isReified) // false 52 | println(kTypeParameter.name) // T 53 | println(kTypeParameter.upperBounds) // [kotlin.Comparable] 54 | println(kTypeParameter.variance) // INVARIANT 55 | 56 | val constructors = kClass.constructors 57 | for (KFunction in constructors) { 58 | KFunction.parameters.forEach { 59 | val name = it.name 60 | val type = it.type 61 | println("name = ${name}") // elements 62 | println("type = ${type}") // kotlin.collections.MutableList 63 | for (KTypeProjection in type.arguments) { 64 | println(KTypeProjection.type) // T 65 | } 66 | } 67 | } 68 | 69 | kClass.declaredFunctions 70 | kClass.members 71 | kClass.typeParameters 72 | 73 | val jClass = container.javaClass // 获取Java Class对象 74 | 75 | val parameterizedType = jClass.genericSuperclass as ParameterizedType // ParameterizedType represents a parameterized type such a Collection 76 | val actualTypeArguments = parameterizedType.actualTypeArguments 77 | for (type in actualTypeArguments) { 78 | val typeName = type.typeName 79 | println("typeName = ${typeName}") 80 | } 81 | 82 | val rawType = parameterizedType.rawType 83 | println("rawType = ${rawType}") 84 | } 85 | 86 | fun compose(f: (B) -> C, g: (A) -> B): (A) -> C { 87 | return { x -> f(g(x)) } 88 | } 89 | 90 | fun isOdd(x: Int) = x % 2 != 0 91 | fun length(s: String) = s.length 92 | 93 | 94 | class A 95 | open class C 96 | class B : C() 97 | 98 | fun fooA() { 99 | // 无法在此处获得运行时 T 的具体类型!!! 100 | val parameterizedType = A()::class.java.genericSuperclass as ParameterizedType 101 | val actualTypeArguments = parameterizedType.actualTypeArguments 102 | for (type in actualTypeArguments) { 103 | val typeName = type.typeName 104 | println("typeName = ${typeName}") 105 | } 106 | } 107 | 108 | fun fooB() { 109 | // 当继承了父类 C 的时候,在此处获得运行时 genericSuperclass T 的具体类型 110 | val parameterizedType = B()::class.java.genericSuperclass as ParameterizedType 111 | val actualTypeArguments = parameterizedType.actualTypeArguments 112 | for (type in actualTypeArguments) { 113 | val typeName = type.typeName 114 | println("typeName = ${typeName}") 115 | } 116 | } 117 | 118 | 119 | fun main(args: Array) { 120 | fooContainer() 121 | // fooA() 122 | // fooB() 123 | 124 | // val nums = listOf(1, 2, 3) 125 | // val filteredNums = nums.filter(::isOdd) 126 | // println(filteredNums) 127 | // 128 | // testReflectProperty() 129 | // 130 | // testBindRef() 131 | 132 | } 133 | 134 | 135 | var one = 1 136 | fun testReflectProperty() { 137 | println(::one.get()) // 1 138 | ::one.set(2) 139 | println(one) // 2 140 | } 141 | 142 | 143 | fun testBindRef() { 144 | val digitRegex = "\\d+".toRegex() 145 | digitRegex.matches("7") // true 146 | digitRegex.matches("6") // true 147 | digitRegex.matches("5") // true 148 | digitRegex.matches("X") // false 149 | 150 | val isDigit = digitRegex::matches // 绑定函数 isNumber = numberRegex::matches 151 | isDigit("7")// true 152 | isDigit("6")// true 153 | isDigit("5")// true 154 | isDigit("X")// true 155 | } 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/reflection/ReflectionDemo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin.reflection 10 | 11 | import java.lang.reflect.ParameterizedType 12 | import kotlin.reflect.KTypeParameter 13 | import kotlin.reflect.full.declaredFunctions 14 | 15 | open class BaseContainer 16 | 17 | class Container> : BaseContainer { 18 | var elements: MutableList 19 | 20 | constructor(elements: MutableList) { 21 | this.elements = elements 22 | } 23 | 24 | fun sort(): Container { 25 | elements.sort() 26 | return this 27 | } 28 | 29 | override fun toString(): String { 30 | return "Container(elements=$elements)" 31 | } 32 | } 33 | 34 | 35 | fun fooContainer() { 36 | val container = Container(mutableListOf(1, 3, 2, 5, 4, 7, 6)) 37 | println(container) 38 | container.sort() 39 | println(container) 40 | 41 | val kClass = container::class // 获取KClass对象 42 | 43 | val jkCLass = kClass.java 44 | println(jkCLass) 45 | // val staticKClass = Container::class 46 | // println(staticKClass) 47 | 48 | val typeParameters = kClass.typeParameters // 获取类型参数typeParameters信息,也即泛型信息 49 | 50 | val kTypeParameter: KTypeParameter = typeParameters[0] 51 | println(kTypeParameter.isReified) // false 52 | println(kTypeParameter.name) // T 53 | println(kTypeParameter.upperBounds) // [kotlin.Comparable] 54 | println(kTypeParameter.variance) // INVARIANT 55 | 56 | val constructors = kClass.constructors 57 | for (KFunction in constructors) { 58 | KFunction.parameters.forEach { 59 | val name = it.name 60 | val type = it.type 61 | println("name = ${name}") // elements 62 | println("type = ${type}") // kotlin.collections.MutableList 63 | for (KTypeProjection in type.arguments) { 64 | println(KTypeProjection.type) // T 65 | } 66 | } 67 | } 68 | 69 | kClass.declaredFunctions 70 | kClass.members 71 | kClass.typeParameters 72 | 73 | val jClass = container.javaClass // 获取Java Class对象 74 | 75 | val parameterizedType = jClass.genericSuperclass as ParameterizedType // ParameterizedType represents a parameterized type such a Collection 76 | val actualTypeArguments = parameterizedType.actualTypeArguments 77 | for (type in actualTypeArguments) { 78 | val typeName = type.typeName 79 | println("typeName = ${typeName}") 80 | } 81 | 82 | val rawType = parameterizedType.rawType 83 | println("rawType = ${rawType}") 84 | } 85 | 86 | fun compose(f: (B) -> C, g: (A) -> B): (A) -> C { 87 | return { x -> f(g(x)) } 88 | } 89 | 90 | fun isOdd(x: Int) = x % 2 != 0 91 | fun length(s: String) = s.length 92 | 93 | 94 | class A 95 | open class C 96 | class B : C() 97 | 98 | fun fooA() { 99 | // 无法在此处获得运行时 T 的具体类型!!! 100 | val parameterizedType = A()::class.java.genericSuperclass as ParameterizedType 101 | val actualTypeArguments = parameterizedType.actualTypeArguments 102 | for (type in actualTypeArguments) { 103 | val typeName = type.typeName 104 | println("typeName = ${typeName}") 105 | } 106 | } 107 | 108 | fun fooB() { 109 | // 当继承了父类 C 的时候,在此处获得运行时 genericSuperclass T 的具体类型 110 | val parameterizedType = B()::class.java.genericSuperclass as ParameterizedType 111 | val actualTypeArguments = parameterizedType.actualTypeArguments 112 | for (type in actualTypeArguments) { 113 | val typeName = type.typeName 114 | println("typeName = ${typeName}") 115 | } 116 | } 117 | 118 | 119 | fun main(args: Array) { 120 | fooContainer() 121 | // fooA() 122 | // fooB() 123 | 124 | // val nums = listOf(1, 2, 3) 125 | // val filteredNums = nums.filter(::isOdd) 126 | // println(filteredNums) 127 | // 128 | // testReflectProperty() 129 | // 130 | // testBindRef() 131 | 132 | } 133 | 134 | 135 | var one = 1 136 | fun testReflectProperty() { 137 | println(::one.get()) // 1 138 | ::one.set(2) 139 | println(one) // 2 140 | } 141 | 142 | 143 | fun testBindRef() { 144 | val digitRegex = "\\d+".toRegex() 145 | digitRegex.matches("7") // true 146 | digitRegex.matches("6") // true 147 | digitRegex.matches("5") // true 148 | digitRegex.matches("X") // false 149 | 150 | val isDigit = digitRegex::matches // 绑定函数 isNumber = numberRegex::matches 151 | isDigit("7")// true 152 | isDigit("6")// true 153 | isDigit("5")// true 154 | isDigit("X")// true 155 | } 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /src/main/kotlin/com/easy/kotlin/tutorial/ExtensionsDemo.kt: -------------------------------------------------------------------------------- 1 | package com.easy.kotlin.tutorial 2 | 3 | import com.easy.kotlin.firstChar 4 | import com.easy.kotlin.lastChar 5 | 6 | fun main(args: Array) { 7 | val str = "abc" 8 | str.firstChar() 9 | str.lastChar() 10 | } -------------------------------------------------------------------------------- /src/main/resources/keyword.md: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2015 JetBrains s.r.o. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.jetbrains.kotlin.lexer; 18 | 19 | import com.intellij.psi.TokenType; 20 | import com.intellij.psi.tree.IElementType; 21 | import com.intellij.psi.tree.TokenSet; 22 | import org.jetbrains.kotlin.kdoc.lexer.KDocTokens; 23 | import org.jetbrains.kotlin.psi.KtPsiUtil; 24 | 25 | public interface KtTokens { 26 | KtToken EOF = new KtToken("EOF"); 27 | 28 | KtToken RESERVED = new KtToken("RESERVED"); 29 | 30 | KtToken BLOCK_COMMENT = new KtToken("BLOCK_COMMENT"); 31 | KtToken EOL_COMMENT = new KtToken("EOL_COMMENT"); 32 | KtToken SHEBANG_COMMENT = new KtToken("SHEBANG_COMMENT"); 33 | 34 | //KtToken DOC_COMMENT = new KtToken("DOC_COMMENT"); 35 | IElementType DOC_COMMENT = KDocTokens.KDOC; 36 | 37 | IElementType WHITE_SPACE = TokenType.WHITE_SPACE; 38 | 39 | KtToken INTEGER_LITERAL = new KtToken("INTEGER_LITERAL"); 40 | KtToken FLOAT_LITERAL = new KtToken("FLOAT_CONSTANT"); 41 | KtToken CHARACTER_LITERAL = new KtToken("CHARACTER_LITERAL"); 42 | 43 | KtToken CLOSING_QUOTE = new KtToken("CLOSING_QUOTE"); 44 | KtToken OPEN_QUOTE = new KtToken("OPEN_QUOTE"); 45 | KtToken REGULAR_STRING_PART = new KtToken("REGULAR_STRING_PART"); 46 | KtToken ESCAPE_SEQUENCE = new KtToken("ESCAPE_SEQUENCE"); 47 | KtToken SHORT_TEMPLATE_ENTRY_START = new KtToken("SHORT_TEMPLATE_ENTRY_START"); 48 | KtToken LONG_TEMPLATE_ENTRY_START = new KtToken("LONG_TEMPLATE_ENTRY_START"); 49 | KtToken LONG_TEMPLATE_ENTRY_END = new KtToken("LONG_TEMPLATE_ENTRY_END"); 50 | KtToken DANGLING_NEWLINE = new KtToken("DANGLING_NEWLINE"); 51 | 52 | KtKeywordToken PACKAGE_KEYWORD = KtKeywordToken.keyword("package"); 53 | KtKeywordToken AS_KEYWORD = KtKeywordToken.keyword("as"); 54 | KtKeywordToken TYPE_ALIAS_KEYWORD = KtKeywordToken.keyword("typealias"); 55 | KtKeywordToken CLASS_KEYWORD = KtKeywordToken.keyword("class"); 56 | KtKeywordToken THIS_KEYWORD = KtKeywordToken.keyword("this"); 57 | KtKeywordToken SUPER_KEYWORD = KtKeywordToken.keyword("super"); 58 | KtKeywordToken VAL_KEYWORD = KtKeywordToken.keyword("val"); 59 | KtKeywordToken VAR_KEYWORD = KtKeywordToken.keyword("var"); 60 | KtKeywordToken FUN_KEYWORD = KtKeywordToken.keyword("fun"); 61 | KtKeywordToken FOR_KEYWORD = KtKeywordToken.keyword("for"); 62 | KtKeywordToken NULL_KEYWORD = KtKeywordToken.keyword("null"); 63 | KtKeywordToken TRUE_KEYWORD = KtKeywordToken.keyword("true"); 64 | KtKeywordToken FALSE_KEYWORD = KtKeywordToken.keyword("false"); 65 | KtKeywordToken IS_KEYWORD = KtKeywordToken.keyword("is"); 66 | KtModifierKeywordToken IN_KEYWORD = KtModifierKeywordToken.keywordModifier("in"); 67 | KtKeywordToken THROW_KEYWORD = KtKeywordToken.keyword("throw"); 68 | KtKeywordToken RETURN_KEYWORD = KtKeywordToken.keyword("return"); 69 | KtKeywordToken BREAK_KEYWORD = KtKeywordToken.keyword("break"); 70 | KtKeywordToken CONTINUE_KEYWORD = KtKeywordToken.keyword("continue"); 71 | KtKeywordToken OBJECT_KEYWORD = KtKeywordToken.keyword("object"); 72 | KtKeywordToken IF_KEYWORD = KtKeywordToken.keyword("if"); 73 | KtKeywordToken TRY_KEYWORD = KtKeywordToken.keyword("try"); 74 | KtKeywordToken ELSE_KEYWORD = KtKeywordToken.keyword("else"); 75 | KtKeywordToken WHILE_KEYWORD = KtKeywordToken.keyword("while"); 76 | KtKeywordToken DO_KEYWORD = KtKeywordToken.keyword("do"); 77 | KtKeywordToken WHEN_KEYWORD = KtKeywordToken.keyword("when"); 78 | KtKeywordToken INTERFACE_KEYWORD = KtKeywordToken.keyword("interface"); 79 | 80 | // Reserved for future use: 81 | KtKeywordToken TYPEOF_KEYWORD = KtKeywordToken.keyword("typeof"); 82 | 83 | KtToken AS_SAFE = KtKeywordToken.keyword("AS_SAFE");//new KtToken("as?"); 84 | 85 | KtToken IDENTIFIER = new KtToken("IDENTIFIER"); 86 | 87 | KtToken FIELD_IDENTIFIER = new KtToken("FIELD_IDENTIFIER"); 88 | KtSingleValueToken LBRACKET = new KtSingleValueToken("LBRACKET", "["); 89 | KtSingleValueToken RBRACKET = new KtSingleValueToken("RBRACKET", "]"); 90 | KtSingleValueToken LBRACE = new KtSingleValueToken("LBRACE", "{"); 91 | KtSingleValueToken RBRACE = new KtSingleValueToken("RBRACE", "}"); 92 | KtSingleValueToken LPAR = new KtSingleValueToken("LPAR", "("); 93 | KtSingleValueToken RPAR = new KtSingleValueToken("RPAR", ")"); 94 | KtSingleValueToken DOT = new KtSingleValueToken("DOT", "."); 95 | KtSingleValueToken PLUSPLUS = new KtSingleValueToken("PLUSPLUS", "++"); 96 | KtSingleValueToken MINUSMINUS = new KtSingleValueToken("MINUSMINUS", "--"); 97 | KtSingleValueToken MUL = new KtSingleValueToken("MUL", "*"); 98 | KtSingleValueToken PLUS = new KtSingleValueToken("PLUS", "+"); 99 | KtSingleValueToken MINUS = new KtSingleValueToken("MINUS", "-"); 100 | KtSingleValueToken EXCL = new KtSingleValueToken("EXCL", "!"); 101 | KtSingleValueToken DIV = new KtSingleValueToken("DIV", "/"); 102 | KtSingleValueToken PERC = new KtSingleValueToken("PERC", "%"); 103 | KtSingleValueToken LT = new KtSingleValueToken("LT", "<"); 104 | KtSingleValueToken GT = new KtSingleValueToken("GT", ">"); 105 | KtSingleValueToken LTEQ = new KtSingleValueToken("LTEQ", "<="); 106 | KtSingleValueToken GTEQ = new KtSingleValueToken("GTEQ", ">="); 107 | KtSingleValueToken EQEQEQ = new KtSingleValueToken("EQEQEQ", "==="); 108 | KtSingleValueToken ARROW = new KtSingleValueToken("ARROW", "->"); 109 | KtSingleValueToken DOUBLE_ARROW = new KtSingleValueToken("DOUBLE_ARROW", "=>"); 110 | KtSingleValueToken EXCLEQEQEQ = new KtSingleValueToken("EXCLEQEQEQ", "!=="); 111 | KtSingleValueToken EQEQ = new KtSingleValueToken("EQEQ", "=="); 112 | KtSingleValueToken EXCLEQ = new KtSingleValueToken("EXCLEQ", "!="); 113 | KtSingleValueToken EXCLEXCL = new KtSingleValueToken("EXCLEXCL", "!!"); 114 | KtSingleValueToken ANDAND = new KtSingleValueToken("ANDAND", "&&"); 115 | KtSingleValueToken OROR = new KtSingleValueToken("OROR", "||"); 116 | KtSingleValueToken SAFE_ACCESS = new KtSingleValueToken("SAFE_ACCESS", "?."); 117 | KtSingleValueToken ELVIS = new KtSingleValueToken("ELVIS", "?:"); 118 | KtSingleValueToken QUEST = new KtSingleValueToken("QUEST", "?"); 119 | KtSingleValueToken COLONCOLON = new KtSingleValueToken("COLONCOLON", "::"); 120 | KtSingleValueToken COLON = new KtSingleValueToken("COLON", ":"); 121 | KtSingleValueToken SEMICOLON = new KtSingleValueToken("SEMICOLON", ";"); 122 | KtSingleValueToken DOUBLE_SEMICOLON = new KtSingleValueToken("DOUBLE_SEMICOLON", ";;"); 123 | KtSingleValueToken RANGE = new KtSingleValueToken("RANGE", ".."); 124 | KtSingleValueToken EQ = new KtSingleValueToken("EQ", "="); 125 | KtSingleValueToken MULTEQ = new KtSingleValueToken("MULTEQ", "*="); 126 | KtSingleValueToken DIVEQ = new KtSingleValueToken("DIVEQ", "/="); 127 | KtSingleValueToken PERCEQ = new KtSingleValueToken("PERCEQ", "%="); 128 | KtSingleValueToken PLUSEQ = new KtSingleValueToken("PLUSEQ", "+="); 129 | KtSingleValueToken MINUSEQ = new KtSingleValueToken("MINUSEQ", "-="); 130 | KtKeywordToken NOT_IN = KtKeywordToken.keyword("NOT_IN", "!in"); 131 | KtKeywordToken NOT_IS = KtKeywordToken.keyword("NOT_IS", "!is"); 132 | KtSingleValueToken HASH = new KtSingleValueToken("HASH", "#"); 133 | KtSingleValueToken AT = new KtSingleValueToken("AT", "@"); 134 | 135 | KtSingleValueToken COMMA = new KtSingleValueToken("COMMA", ","); 136 | 137 | KtToken EOL_OR_SEMICOLON = new KtToken("EOL_OR_SEMICOLON"); 138 | KtKeywordToken FILE_KEYWORD = KtKeywordToken.softKeyword("file"); 139 | KtKeywordToken FIELD_KEYWORD = KtKeywordToken.softKeyword("field"); 140 | KtKeywordToken PROPERTY_KEYWORD = KtKeywordToken.softKeyword("property"); 141 | KtKeywordToken RECEIVER_KEYWORD = KtKeywordToken.softKeyword("receiver"); 142 | KtKeywordToken PARAM_KEYWORD = KtKeywordToken.softKeyword("param"); 143 | KtKeywordToken SETPARAM_KEYWORD = KtKeywordToken.softKeyword("setparam"); 144 | KtKeywordToken DELEGATE_KEYWORD = KtKeywordToken.softKeyword("delegate"); 145 | KtKeywordToken IMPORT_KEYWORD = KtKeywordToken.softKeyword("import"); 146 | KtKeywordToken WHERE_KEYWORD = KtKeywordToken.softKeyword("where"); 147 | KtKeywordToken BY_KEYWORD = KtKeywordToken.softKeyword("by"); 148 | KtKeywordToken GET_KEYWORD = KtKeywordToken.softKeyword("get"); 149 | KtKeywordToken SET_KEYWORD = KtKeywordToken.softKeyword("set"); 150 | KtKeywordToken CONSTRUCTOR_KEYWORD = KtKeywordToken.softKeyword("constructor"); 151 | KtKeywordToken INIT_KEYWORD = KtKeywordToken.softKeyword("init"); 152 | 153 | KtModifierKeywordToken ABSTRACT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("abstract"); 154 | KtModifierKeywordToken ENUM_KEYWORD = KtModifierKeywordToken.softKeywordModifier("enum"); 155 | KtModifierKeywordToken OPEN_KEYWORD = KtModifierKeywordToken.softKeywordModifier("open"); 156 | KtModifierKeywordToken INNER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inner"); 157 | KtModifierKeywordToken OVERRIDE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("override"); 158 | KtModifierKeywordToken PRIVATE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("private"); 159 | KtModifierKeywordToken PUBLIC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("public"); 160 | KtModifierKeywordToken INTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("internal"); 161 | KtModifierKeywordToken PROTECTED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("protected"); 162 | KtKeywordToken CATCH_KEYWORD = KtKeywordToken.softKeyword("catch"); 163 | KtModifierKeywordToken OUT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("out"); 164 | KtModifierKeywordToken VARARG_KEYWORD = KtModifierKeywordToken.softKeywordModifier("vararg"); 165 | KtModifierKeywordToken REIFIED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("reified"); 166 | KtKeywordToken DYNAMIC_KEYWORD = KtKeywordToken.softKeyword("dynamic"); 167 | KtModifierKeywordToken COMPANION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("companion"); 168 | KtModifierKeywordToken SEALED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("sealed"); 169 | 170 | KtModifierKeywordToken DEFAULT_VISIBILITY_KEYWORD = PUBLIC_KEYWORD; 171 | 172 | KtKeywordToken FINALLY_KEYWORD = KtKeywordToken.softKeyword("finally"); 173 | KtModifierKeywordToken FINAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("final"); 174 | 175 | KtModifierKeywordToken LATEINIT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("lateinit"); 176 | 177 | KtModifierKeywordToken DATA_KEYWORD = KtModifierKeywordToken.softKeywordModifier("data"); 178 | KtModifierKeywordToken INLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inline"); 179 | KtModifierKeywordToken NOINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("noinline"); 180 | KtModifierKeywordToken TAILREC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("tailrec"); 181 | KtModifierKeywordToken EXTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("external"); 182 | KtModifierKeywordToken ANNOTATION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("annotation"); 183 | KtModifierKeywordToken CROSSINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("crossinline"); 184 | KtModifierKeywordToken OPERATOR_KEYWORD = KtModifierKeywordToken.softKeywordModifier("operator"); 185 | KtModifierKeywordToken INFIX_KEYWORD = KtModifierKeywordToken.softKeywordModifier("infix"); 186 | 187 | KtModifierKeywordToken CONST_KEYWORD = KtModifierKeywordToken.softKeywordModifier("const"); 188 | 189 | KtModifierKeywordToken SUSPEND_KEYWORD = KtModifierKeywordToken.softKeywordModifier("suspend"); 190 | 191 | KtModifierKeywordToken HEADER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("header"); 192 | KtModifierKeywordToken IMPL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("impl"); 193 | 194 | TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD, 195 | THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD, 196 | NULL_KEYWORD, 197 | TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, 198 | IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, 199 | ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD, 200 | NOT_IN, NOT_IS, AS_SAFE, 201 | TYPEOF_KEYWORD 202 | ); 203 | 204 | TokenSet SOFT_KEYWORDS = TokenSet.create(FILE_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, 205 | SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, 206 | OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, 207 | CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, 208 | DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD, 209 | FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SETPARAM_KEYWORD, 210 | DELEGATE_KEYWORD, 211 | LATEINIT_KEYWORD, 212 | DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, 213 | ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, 214 | SUSPEND_KEYWORD, HEADER_KEYWORD, IMPL_KEYWORD 215 | ); 216 | 217 | /* 218 | This array is used in stub serialization: 219 | 1. Do not change order. 220 | 2. If you add an entry or change order, increase stub version. 221 | */ 222 | KtModifierKeywordToken[] MODIFIER_KEYWORDS_ARRAY = 223 | new KtModifierKeywordToken[] { 224 | ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, 225 | PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, 226 | REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATEINIT_KEYWORD, 227 | DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, 228 | CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, SUSPEND_KEYWORD, HEADER_KEYWORD, IMPL_KEYWORD 229 | }; 230 | 231 | TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY); 232 | 233 | TokenSet TYPE_MODIFIER_KEYWORDS = TokenSet.create(SUSPEND_KEYWORD); 234 | TokenSet TYPE_ARGUMENT_MODIFIER_KEYWORDS = TokenSet.create(IN_KEYWORD, OUT_KEYWORD); 235 | TokenSet RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS = TokenSet.create(OUT_KEYWORD, VARARG_KEYWORD); 236 | 237 | TokenSet VISIBILITY_MODIFIERS = TokenSet.create(PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD); 238 | 239 | TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE); 240 | 241 | /** 242 | * Don't add KDocTokens to COMMENTS TokenSet, because it is used in KotlinParserDefinition.getCommentTokens(), 243 | * and therefor all COMMENTS tokens will be ignored by PsiBuilder. 244 | * 245 | * @see KtPsiUtil#isInComment(com.intellij.psi.PsiElement) 246 | */ 247 | TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT, SHEBANG_COMMENT); 248 | TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.orSet(COMMENTS, WHITESPACES); 249 | 250 | TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, REGULAR_STRING_PART); 251 | TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, AS_SAFE, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, EXCLEXCL, MUL, PLUS, 252 | MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR, 253 | SAFE_ACCESS, ELVIS, 254 | RANGE, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ, 255 | NOT_IN, NOT_IS, 256 | IDENTIFIER); 257 | 258 | TokenSet AUGMENTED_ASSIGNMENTS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ); 259 | TokenSet ALL_ASSIGNMENTS = TokenSet.create(EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ); 260 | } 261 | -------------------------------------------------------------------------------- /src/test/kotlin/com/easy/kotlin/AnnotationClassNoteTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | import com.easy.kotlin.annotation.SwordTest 12 | import org.junit.Test 13 | import org.junit.runner.RunWith 14 | import org.junit.runners.JUnit4 15 | 16 | @RunWith(JUnit4::class) 17 | class AnnotationClassNoteTest { 18 | @Test 19 | fun testAnno() { 20 | val sword = SwordTest() 21 | sword.testCase("10000") 22 | } 23 | } -------------------------------------------------------------------------------- /src/test/kotlin/com/easy/kotlin/FullJavaInteroperabilityTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package com.easy.kotlin 10 | 11 | import org.junit.Assert 12 | import org.junit.Test 13 | import org.junit.runner.RunWith 14 | import org.junit.runners.JUnit4 15 | 16 | @RunWith(JUnit4::class) 17 | class FullJavaInteroperabilityTest { 18 | @Test 19 | fun test() { 20 | val list = getArrayList() 21 | Assert.assertTrue(list.size == 3) 22 | } 23 | } --------------------------------------------------------------------------------