WeTest 导读

Java 9预计今年也会正式发布,Java 8这个最具变革性且变革性最适于GUI程序的版本,Android终于准备正式支持。从自己开发JavaFx的感受,说一说Java 8应该使用的新特性。程序员,你应该拥抱变化。 (注:本文不讲具体语法,具体语法请下载下方分享的《Java 8实战》。)


James Lau(google的产品经理):We’ve decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by theAndroid build system.

我们决定弃用 Jack 工具链,改为直接在最新的 javac 和 dx 工具集中增加对 Java 8 语言功能的支持。经过这番改弦易辙,依赖于 Java 类文件格式的现有工具和插件仍可继续工作。今后,Java 8 语言功能将得到 Android 构建系统的原生支持。

一、GUI桌面类软件特点

GUI图形界面的应用程序有几个特点:

● 基于消息驱动模型

● 强交互,实时性要求高

● 用户触发执行与用户触发结束

二、Lambda表达式

举个实际应用中的例子,下面这部分的代码是过滤出某个目录下所有xml后缀的文件,java 8之前的写法是这样子的:

Java 8的写法

lambda需要解决的一个核心问题啰嗦,lambda能做的内部类都能做。Java是面向对象的语言,不支持方法。C语言的方法,在java里面可能是一个接口,可能是一个静态方法。listFiles这个方法需要的是一个行为(行为参数化,更高级的抽象),这个行为是name.endsWith(“.xml”),但是java不支持传递行为方法。所以,java 8之前我们不得不用函数接口(只包含一个方法的接口,专有名词函数接口)对象的方式来对行为进行包装。刻薄的讲FileTypeFilter类命名为FilenameFilterActionWrapper更加贴切。

1、方法引用

Lambda有一种快捷写法,方法引用。之前说,在Java中定义方法的方式,一种是接口,一种是静态方法,现有的库中已经包含有大量的方法。方法引用,可以让我们重用这些方法,让这些方法像Lambda一样能够被传递。

GUI程序中的用法,这种写法Java 8之前,在JavaFx或者Android程序中都应该会大量出现

Java 8之后的写法应该是这样的

这两者的差别,解释起来应该是这样子的。本质:”直接调用这个方法”,Lambda或者java 8之前”描述如何调用这个方法”。你没必要再去描述如何调用,因为都知道该怎么调用。我们知道GUI程序最基本的设计时MVC,解决的是视图和逻辑分离,这几乎是GUI程序设计里面最基本的。逻辑处理方法一般并不会包含在控制器的类里面,而是在逻辑层,有了方法引用你可以直接与逻辑层的方法相关联。

2、为什么要lambda

● 简洁的代码,跟利于行为参数化(高级抽象,if else->参数化-行为参数化)

● 预设的lambda接口,Predicate、Consumer、Function等,java 8大量库支持。如果你不理解lambda,你将不理解大量Java 8的接口。

● 类型检查、类型推断更优

注:写lambda的时候,参数一定要有含义,本来就不写类型了,再不写有含义的变量就真的是天书了。

三、CompetableFuture组合式异步编程

一个解析Android apk信息的类,可能会解析很长一段时间,所以需要有超时。
Java 5之前的写法

Java 5的写法

Java 8

那么CompletableFuture除了少些几句代码之外,它到底有什么好处呢?

● 约定:与设计模式一样,这是程序员的一种约定。接口返回CompletableFuture,调用者一眼就只这是个异步API,也知道如何调用它

● 同步转异步:配合lambda,几句话就能完成。

● 异常传递:apkInformation.completeExceptionally(new WeTestRuntimeException(e.getMessage(), e)),其他线程的异常可以传递过来。GUI程序里面,异常通常要转化为用户的一种视图。

● 协调:等待多个异步操作完成合并(如查找多家网站酒店价格,取最小值),等待多个异步操作中最快的一个完成,异步操作完成后回调一个函数(异步操作完成,来个Toast)。在以前这些协调性的功能,可能需要借助CountDownLatch,CyclicBarrier来完成。CompletableFuture一步到位

注:CompletableFuture配合Stream可以极大的提高并发的效率

举个简单的上面这个例子返回后的用法:

四、Stream流处理

Use stream operations to express refined data processing queries.用流Stream以表达式的方式来完成数据处理。我自己的理解是,以数据库的操作方式来完成数据的处理。Java 8的Stream内置了许多类似于数据库的操作filter、sort、map、reduce等。
Stream优点:

● 以数据库操作数据的方式,专注于如何做这个某个步骤,表达式的方式

● 高并发(看到map、reduce就应该能想到了)

举个用法的例子,业务时获取所有在线的可测试的手机:

注:Stream的写法的确对原因的思维方式会造成一定的冲击,不过写过了,加上有一定数据库使用基础的话理解起来非常容易。Stream高性能的特点的确感受不深,因为处理大量数据的情况毕竟是少数。

五、Optional

A container object which may or may not contain a non-null value.一个可能包含null指的对象包装器。null不可避免,能避免的是NullPointerException。null最大的罪在于它可以代表任何类型。下面这两个接口,不去看你的注释,我并不知道你是否可能会返回null。在业务需求变化如此快的今天,贴切非常容易出现对返回值不做检查的情况,任何人都会偷懒。Optional的处理逻辑是,强迫你去检查。如果我的返回值是Optional,这个接口显式的告诉你可能返回的是null值,这个在GUI程序里面特别常见。

GUI的弹出框用户可能并不填内容内容,返回null。

所以,Optional的核心思想就是我明确告诉你可能会返回null,你一定要处理。所以,现在模块间提供给其他人的接口,如果有可能返回为null都要声明为Optional。Java 8大量的官方接口也都会放回Optional,这个是一定要学的内容。

Java 8实战:https://share.weiyun.com/075e6cd0f306c706260fb377c38ac90b


近日,谷歌发布了安卓8.0开发者预览版。腾讯WeTest立刻在云真机产品中增加了带有安卓O系统的真机。

想要率先体验的用户可以登录:http://wetest.qq.com/product/cloudphone

如在使用中有任何疑问,欢迎联系企业qq:800024531

程序员要拥抱变化,聊聊Android即将支持的Java 8的更多相关文章

  1. Web程序员开发App系列 - 调试Android和IOS手机代码(补图)

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  2. 程序员之路:以Android证道

    大道三千,何以证道? 最近有私信.邮件给我咨询一些职业生涯规划的同学,我在这里以过来人的身份给大家一些建议. 任何行业,任何职位,无论高低,无论大小,都可以分为广博.精深两个方向. 精深自然指的是在某 ...

  3. 【Java】Java程序员面试宝典(第三版)第5章----Java程序设计基本概念

    1.static静态变量,在次级作用域也可以被修改. 2.k++ + k++.第一个自加实际上只有在与计算+k++时补增.详情P36的题目. 3.Java数据类型从低到高分为(byte short c ...

  4. 最初程序员的思维“修炼”之四——Android平台开发的“强制关闭”解决思路

    我和我的朋友参加一个比赛——物联网应用技能大赛,这个大赛所要求的技能有,硬件技术,Android平台开发技术,.NET平台开发技术,所以这是一个团队合作的比赛,基本上没有人能同时掌握这三种技术(在校生 ...

  5. 对java程序员来说时间格式永远让人挠头来看Java Date Time 教程-时间测量

    在Java中,用System.currentTimeMillis()来测量时间最方便. 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差.下面是一个例子: long s ...

  6. 牛客网程序员面试金典:1.2——原串翻转(java实现)

    问题描述: 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniString,请返回一个string,为翻转后的字符串. ...

  7. 多少牛逼的程序员毁在low逼的英文发音上(JAVA)

    最最常用的关键词及音标 数据类型:boolean.byte.short.int.long.double.char.float.double. 包引入和包声明:import.package. 用于类和接 ...

  8. (转).net程序员转战android第三篇---登录模块之静态登录

    这一篇我将分2个部分记录登录界面,第一部分是静态登录, 这部分将如何从界面布局.控件使用.文件关系.数据验证.登陆实现等5小块记录. 第二部分是动态登录,这块会基于上面的4小块,在数据验证不是静态数据 ...

  9. .net程序员转战android第三篇---登录模块之静态登录

    这一篇我将分2个部分记录登录界面,第一部分是静态登录, 这部分将如何从界面布局.控件使用.文件关系.数据验证.登陆实现等5小块记录. 第二部分是动态登录,这块会基于上面的4小块,在数据验证不是静态数据 ...

随机推荐

  1. JAVA基础知识(2)--关键字static的使用

    在Java类中声明属性.方法和内部类时,可使用关键字static作为修饰符,static标记的属性和方法可以由整个类进行共享,因此static修饰的属性称为类成员或者称为类方法:static修饰的方法 ...

  2. layer插件

    最近在做公司的官网,其中有用到layer这款插件,以前没有接触过,不过学下来觉得好用好学.下面分享一下我的学习心得. layer是web弹出层组件.在官网下载好layer后,把他部署到你的项目文件中( ...

  3. struts2(四) ognl表达式、值栈、actionContext之间的关系

    今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...

  4. Python 爬取qqmusic音乐url并批量下载

    qqmusic上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫. 至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在ur ...

  5. iOS开发之应用沙盒

    1.应用沙盒概述 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 应用沙盒的文件系统目录,如下图所示(假设应用的名 ...

  6. as3 操作图片,获取,设置实际像素,扣除透明区域

    private var a:Loader = new Loader(); private function test():void { a.load(new URLRequest("asse ...

  7. 【转】flash air中读取本地文件的三种方法

    actionscript中读取本地文件操作有两种代码如下 1.使用File和FileStream两个类,FileStream负责读取数据的所以操作:(同步操作) var stream:FileStre ...

  8. 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器

    JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...

  9. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析

    对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM ...

  10. json解包与json封包

    首先,对两个名词进行简单的说明: 1.NSData 用来存储二进制的数据类型.NSData类提供了一种简单的方式,它用来设置缓冲区.将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件.不变缓冲区(N ...