Java8系列之初识
前言:终于有机会在工作中使用高版本的Java8,但是一直没有对java8中添加的新特性进一步了解过,所以趁着这个机会学习一下,能够在编程中熟练的使用。
一、接口的改变
我们知道,在java8版本以前,接口中只能定义静态常量和抽象方法,但是在java8添加了默认方法,也叫扩展方法;
public interface DefaultInterface {
//默认是public static final,也只能是
public static final int count=0;
//抽象方法
void add(); //默认方法==>扩展方法
default int add(int x,int y ) {
return x+y;
} }
这样,实现类不必实现默认方法,只需实现抽象方法,使用时直接调用接口中的方法。(好像和流式的api引入有关)
public class DefaultImpl implements DefaultInterface { @Override
public void add() {
System.out.println("我是抽象方法的实现"); }
public static void main(String[] args) {
DefaultInterface di=new DefaultImpl();
di.add();
di.add(12, 3);
}
}
还记得匿名内部类的使用吗?设计匿名内部类的目的就是方便程序员把代码作为数据传递。有时候写的多了会很烦这样的模板代码,但这还不是最重要的,最重要的是表达我们想传递的是行为,而不是对象。例如:
Collections.sort(list, new Comparator<String>() { public int compare(String o1, String o2) { return o1.compareTo(o2);
}
});
二、lamada表达式的引出
简写匿名内部类的模板代码:
(1)
Collections.sort(list,(String o1,String o2)->{
return o1.compareTo(o2);
});
(2)
Collections.sort(list,(String o1,String o2)->o1.compareTo(o2));
(3)
Collections.sort(list,(o1,o2)->o1.compareTo(o2));
方式(3)的参数类型是由编译器自行推导出的,根据上下文环境;但有时也要显示的声明。
2、你可还记得匿名内部类中只能使用final变量吗,但是在java8中放宽了这一限制,虽然不要求变量必须声明为final的,但是是即成事实上的final变量。
int num=0;
Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) {
System.out.println(num);;
return o1.compareTo(o2);
}
});
什么是即成事实上的final变量,虽然我们定义了num变量,但是在匿名内部类中仍不能对其做出修改,说明它是值。
同样我们如果在lamada表达式中对num做出修改,编译器会报“Local variable num defined in an enclosing scope must be final or effectively final”;
Collections.sort(list,(a,b)->num++);
3、lamada表达式的类型
我们知道在java中,所有的方法参数都有类型,那么lamada表达式的类型是什么?这里就要引出函数接口的概念:
什么是函数接口:就像前面提到的Comparable接口,接口只定义了一个抽象方法,public int compareTo(T o);其实Java中有很多这样的接口,我们把这样的接口称之为函数接口。只有这样的函数接口才能使用lamada表达式。
例如: 参数------------>函数接口------------->返回值类型
Java8系列之初识的更多相关文章
- WCF编程系列(一)初识WCF
WCF编程系列(一)初识WCF Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念: 地址:定义服务的 ...
- Java8系列 (七) CompletableFuture异步编程
概述 Java8之前用 Future 处理异步请求, 当你需要获取任务结果时, 通常的做法是调用 get(long timeout, TimeUnit unit) 此方法会阻塞当前的线程, 如果任务 ...
- Java8系列 (一) Lambda表达式
函数式编程 在介绍Lambda表达式之前, 首先需要引入另一个概念, 函数式编程. 函数式编程是一种编程范式, 也就是如何编写程序的方法论.它的核心思想是将运算过程尽量写成一系列嵌套的函数调用,关注的 ...
- Gradle系列之初识Gradle
原文首发于微信公众号:躬行之(jzman-blog) 学习 Android 有一段时间了,开发中经常使用到 Gradle ,但是不知道 Gradle 构建项目的原理,计划花一点时间学习一下 Gradl ...
- .net core系列之初识asp.net core
.net core已经发布了2.0版本,相对于1.0的有了很大的完善,最近准备在项目中尝试使用asp.net core,所以就进行了一些简单的研究. 初识asp.net core分为以下几个部分: 1 ...
- SpringMVC 框架系列之初识与入门实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...
- 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法
在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...
- Node.js实战项目学习系列(1) 初识Node.js
前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...
- Vue.js系列之一初识Vue
在看vue.js之前,可以先看这两篇文章,对于为什么要使用vue会有一定帮助 1.Vue.js !important 2.界面之下:还原真实的MV*模式 !important 3.web前端优化之re ...
随机推荐
- 201521123062《Java程序设计》第1周学习总结
1.本章学习总结 认识Java平台运行环境,运行软件 初步认识JDK,JRE,JVM基本含义 书面作业 1.为什么java程序可以跨平台运行?执行java程序的步骤是什么? Java平台运行在各平台的 ...
- WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。
最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...
- Day-18: 电子邮件
---恢复内容开始--- 假设要从**@163.com发送邮件到**@sina.com,会经过下面几个过程: 首先,你得使用邮件代理软件(也就是MUA:Mail User Agent),例如Outlo ...
- Python编码_ASCII_Unicode_UTF-8
获取一个字符的ASCII码值,使用内置函数 ord(),ASCII码占一个字节 ascii不能存中文 >>> # A 和 a 分别的对应的ASCII码值是 >>> ...
- 字符、字符集、编码,以及它们python中会遇到的一些问题(下)
在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇, ...
- MySQL线程池的引入可以提高我们的MySQL的性能
支持线程池的版本:MySQL 企业版本,MySQL percona的分支 MariDB 的版本.我们知道我们的MySQL 语句是不支持硬解析的,没有无SQL 解析 cache.每个连接对应一个线程,我 ...
- C语言bitmap的使用技巧
bitmap是一种以位的状态来表示某种特性的状态的一种操作方式,类似嵌入式中的寄存器操作,在表示某种特性enable/disable的时候很适用且占用的内存空间也很小 比如:做过交换机或者企业网管,路 ...
- CentOS7下安装MariaDB
环境:Window10 上建立 VMWare 虚拟机,EasyInstaller 方式安装 CentOS 7 1. “失败”的经历 备份原 repo 文件,并更改 yum 源(方法详见修改yum源)为 ...
- oracle 数据库管理--管理表空间和数据文件
一.概念表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库数据则是存放在表空间中,表空间由一个或多个数据文件组成. 二.数据库的逻辑结构oracle中逻辑结构包括 ...
- 用Atom打造简单的java编译器以及对于可能出现的问题解答
如何用Atom打造简单的javaIDE 自己一直比较喜欢Atom编辑器,前段时间给Atom配置好了C/C++的运行环境,自己心里还是感觉挺好的,最近在学习java ,偶然的机会让我看到了一篇文章,就是 ...