0%

Java

Android应用开发语言。

开发环境

MacBook Pro 16

开发工具

Android Studio 3.5.3

Android Studio

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,还在数据分析、网络爬虫、云计算领域大显身手。

regex

一个示例项目,从0开始,使用 Java 实现一个正则表达式引擎,核心代码只有200多行,用来学习编译原理。

编程实践

2020.01.26


java8新特性

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 表达式,术业有专攻. 利用接口多继承特性,做到接口的集大成者.

参考资料

  1. Android 开发者指南
  2. Java学习教程
  3. Java 教程
  4. Java 语言快速入门
  5. awesome-java-leetcode
  6. 2019年 Github 上最热门的 Java 开源项目
  7. All Algorithms implemented in Java
  8. Java学习+面试指南
  9. 深入理解Java虚拟机
  10. EVM
  11. 停止用 Eclipse 教 Java
  12. javaagent
  13. Java 库 fastjson 被曝存“高危”远程代码执行漏洞
  14. 关于 Java 的25件事
  15. 2020年值得推荐的13本 Java 书籍
  16. Java 8 之后的语法增强

欢迎关注我的其它发布渠道