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. 不可重入定时器Newlife.TimerX

    在.net常用的定时器类有下面三种,使用定时器时需要设定参数,如间断时间.定时器计溢出后的回调函数.延时.开始等,定时器的的主要方法有开始.终止等,不同的定时器实现上述的方法会有一些差异,本文会针对具 ...

  2. web简易MP3播放插件 Aplayer篇章一

    效果如图所示: 写入初始代码,定义一个id唯一的div player1 <!DOCTYPE html> <html> <head> <meta charset ...

  3. 跑马灯、短信与反射EditText

    1.1.跑马灯功能 Android自带支持跑马灯功能,实现此功能需要设置已下属性: android:ellipsize="marquee" // 必选,跑马灯样式 android: ...

  4. ISO c++ 14 重点介绍[译]

    原文链接 http://marknelson.us/2014/09/11/highlights-of-iso-c14/ 下面是对你的日常开发有重大影响的C++14新变动,列出了一些示例代码,并讨论何时 ...

  5. SHA1l加密

    public static string SHA1Encrypt(string sourceText) { SHA1 sha = new SHA1CryptoServiceProvider(); AS ...

  6. 手动编写JQUERY插件

    就拿一个简单的示例来说,鼠标点击输入框,提示文字消息,鼠标移开,再显示提示文字. <script type="text/javascript"> //编写插件 (fun ...

  7. (转)CentoS 下报的 Requires: perl(:MODULE_COMPAT_5.8.8)

    vim /etc/yum.repos.d/epel.repo 把 mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5& ...

  8. 解决mac os下mcss命令报错:env: node\r: No such file or directory

    标题无“转载”即原创文章,版权所有.转载请注明来源:http://besteam.im/blogs/article/31/. 我一直对字符界面有抵触感,即使会用vim,我的linux脚本(python ...

  9. Unity 3D Framework Designing(4)——设计可复用的SubView和SubViewModel(Part 1)

    『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率. 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是我们熟知的『高内聚,低耦合』原则. 组件化 ...

  10. java.lang.NoClassDefFoundError异常

    1.错误信息 2.错误分析: JVM读到程序的第三行,会在当前路径 "D:\java" 下寻找com.yangquan.aolun这个包路径下的Cat类,但当前路径下根本就没有co ...