前言:终于有机会在工作中使用高版本的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系列之初识的更多相关文章

  1. WCF编程系列(一)初识WCF

    WCF编程系列(一)初识WCF   Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念:  地址:定义服务的 ...

  2. Java8系列 (七) CompletableFuture异步编程

    概述 Java8之前用 Future 处理异步请求, 当你需要获取任务结果时, 通常的做法是调用  get(long timeout, TimeUnit unit) 此方法会阻塞当前的线程, 如果任务 ...

  3. Java8系列 (一) Lambda表达式

    函数式编程 在介绍Lambda表达式之前, 首先需要引入另一个概念, 函数式编程. 函数式编程是一种编程范式, 也就是如何编写程序的方法论.它的核心思想是将运算过程尽量写成一系列嵌套的函数调用,关注的 ...

  4. Gradle系列之初识Gradle

    原文首发于微信公众号:躬行之(jzman-blog) 学习 Android 有一段时间了,开发中经常使用到 Gradle ,但是不知道 Gradle 构建项目的原理,计划花一点时间学习一下 Gradl ...

  5. .net core系列之初识asp.net core

    .net core已经发布了2.0版本,相对于1.0的有了很大的完善,最近准备在项目中尝试使用asp.net core,所以就进行了一些简单的研究. 初识asp.net core分为以下几个部分: 1 ...

  6. SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...

  7. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  8. Node.js实战项目学习系列(1) 初识Node.js

    前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...

  9. Vue.js系列之一初识Vue

    在看vue.js之前,可以先看这两篇文章,对于为什么要使用vue会有一定帮助 1.Vue.js !important 2.界面之下:还原真实的MV*模式 !important 3.web前端优化之re ...

随机推荐

  1. 201521123014 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. GUI与Sw ...

  2. 201521123073 《Java程序设计》第6周学习总结

    1. 本章学习总结 2. 书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 1.2 自己设计类时,一 ...

  3. 201521123028《Java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看. 对上周PTA的实验5-3中的矩形和圆形类做注释. Q2.面向对象 ...

  4. 201521123044 《Java程序设计》第13周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.ed ...

  5. 201521123035《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  6. 201521123038 《Java程序设计》 第十周学习总结

    201521123038 <Java程序设计> 第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题 ...

  7. 2015211230108《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally的作用: 1.确定程序 ...

  8. spring的一些问题

    1.什么是spring? spring是一个轻量级的一站式框架,它的核心有两个部分,1.aop面向切面编程 2.ioc控制反转. 2.什么是aop aop就是面向切面编程,使用aop可以使业务逻辑各个 ...

  9. LuoguP1196_银河英雄传说_KEY

    银河英雄传说 题目描述 公元5801年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历799年,银河系的两大军事集团在巴米利恩星域爆 ...

  10. jquery对象和js对象

    <ul id="ul1">   <li id="li_1">01</li>   <li>02</li> ...