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 ...
随机推荐
- 201521123111《Java程序设计》第6周学习总结
1. 本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123054 《Java程序设计》第5周学习总结
1. 本周学习总结 2. 书面作业 作业参考文件下载 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出 ...
- 201521123118《java程序与设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出 ...
- 一个Markdown的例子
一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...
- 【Socket编程】通过Socket实现UDP编程
通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法
1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...
- Manacher详解
之前的字符串题解中对Manacher的思想进行了简略的介绍,在这篇文章中,我将会详细的将这个算法的初衷和具体实现理论进行解释.声明一点,这是我个人的理解,可能有不全面之处,望多包涵.在之前的几篇文章中 ...
- 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
迭代器模式 概念介绍 迭代器模式(Iterator): 在不暴露对象内部结构的同时,可以顺序地访问聚合对象内部的元素. 迭代器 程序中的循环是一种利器,循环语句也使我们程序开发更简洁高效,但是有时一遍 ...
- 箱线图(boxplot)简介与举例
简述: 盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的.它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(m ...
- 童话故事 --- 通信协议之 HDLC 浅析
高飞狗: "高飞的白鹭浮水的鹅,唐诗里有画-" 布鲁托: "高飞狗,又在做你的高飞梦哪!" 高飞狗: "哈罗,布鲁托,这几天好郁闷呐!" 布 ...