Android应用开发语言。
开发环境
MacBook Pro 16
开发工具
Android Studio 3.5.3
Google在2013的I/O开发者大会上正式对外宣布Android Studio将作为Android开发的主要IDE,它是基于IntelliJ IDEA打造的一款专门开发Android的神器。对于以前一直用ADT(Android Development Tools)的开发者谷歌建议转到Android Studio上来。官方也对外宣布了不再对ADT维护更新。Adnroid Studio支持Windows、MAC和Linux等操作系统。
学习资料
Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念。Java 不但可以用来开发网站后台、PC 客户端和 Android APP,还在数据分析、网络爬虫、云计算领域大显身手。
一个示例项目,从0开始,使用 Java 实现一个正则表达式引擎,核心代码只有200多行,用来学习编译原理。
编程实践
2020.01.26
lambda表达式 下面通过对比 java8 之前的普通实现和 java8 引入lambda 表达式的实现,帮助读者快速了解代码差异性,眼见为实,赶紧开始吧!
1 2 3 4 5 6 7 8 9 10 11
| public static void main(String[] args) { // 方法1: jdk8以前的实现 int[] nums = {33, 55, -55, 90, -666, 90}; int min = Integer.MAX_VALUE; for (int i : nums) { if (i < min) { min = i; } } System.out.println(min); // 方法2: jdk8使用 lambda 表达式 int min2 = IntStream.of(nums).parallel().min().getAsInt(); System.out.println(min2); }
|
方法1体现的是命令式编程的思维,需要明确编程细节,如果细节拿捏不准,那么结果自然不对. 而方法2则是函数式编程,只关注目标和结果,忽略过程,思路清晰更容易理解.
创建线程运行任务
1 2 3 4 5 6 7 8 9 10
| public static void main(String[] args) { // 方法1: jdk8以前一般写法 new Thread(new Runnable() { @Override public void run() { System.out.println("ok"); } }).start(); // 方法2: jdk8采用 lambda 表达式写法 new Thread(() -> System.out.println("ok")).start(); }
|
从上例可以看出,这里的lambda 表达式 返回的是实现了指定接口的对象实例. 小结 lambda 表达式 实现指定接口方法并返回该接口实例对象 lambda 表达式 由输入和输出以及实现过程三部分组成,不在乎方法名.
初体验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // 定义只有一个方法的接口 interface TestInterface { int doubleNum(int i); }
public static void main(String[] args) {
// 方法1: 实现doubleNum方法,实现过程是输入i返回 i*2,最终得到实现了该接口的实例对象 TestInterface i1 = i -> i * 2; System.out.println(i1.doubleNum(1));
// 方法2: 多个入参时需要用()包围起来,只有一个入参时可省略,见方法1 TestInterface i2 = (i) -> i * 2; System.out.println(i2.doubleNum(1));
// 方法3: 入参可指定类型,没有明确指定类型时自动推断,如方法1和方法2均未指定入参类型 TestInterface i3 = (int i) -> i * 2; System.out.println(i3.doubleNum(1));
// 方法4: 实现体不止一句代码时,需要用{}包围起来,并在实现体内部处理出参,当然实际情况中也可能并没有返回值 TestInterface i4 = (int i) -> { System.out.println("regular lambda expression"); return i * 2; }; System.out.println(i4.doubleNum(1)); }
|
lambda 表达式 实现的接口有且仅有一个要实现的接口,体现了 java 的单一职责原则. 这一点也很好理解,如果不止一个接口需要实现,那实现的具体是哪一个方法呢?所以这样的情况在 ide 中一般都会有相应的提示. 此外,java8 引入新的注解 @FunctionInterface 来支持lambda 表达式,也可用于ide 自动提示. 而上例中,我们的接口并没有标注过该注解,不是也能正常工作吗?是的,确实是这样的,所以@FunctionInterface 只是声明式注解,并没有实际作用,不过实际工作中最好加上@FunctionInterface 该注解,万一以后有用呢?
小结 lambda 表达式 实现的接口需要有 @FunctionInterface 注解,并且要实现的方法有且仅有一个. 日常工作中也应该学习单一职责原则,接口设计要足够细,方便使用lambda 表达式,术业有专攻. 利用接口多继承特性,做到接口的集大成者.
参考资料
- Android 开发者指南
- Java学习教程
- Java 教程
- Java 语言快速入门
- awesome-java-leetcode
- 2019年 Github 上最热门的 Java 开源项目
- All Algorithms implemented in Java
- Java学习+面试指南
- 深入理解Java虚拟机
- EVM
- 停止用 Eclipse 教 Java
- javaagent
- Java 库 fastjson 被曝存“高危”远程代码执行漏洞
- 关于 Java 的25件事
- 2020年值得推荐的13本 Java 书籍
- Java 8 之后的语法增强