java1.8的几大新特性(一)
一、接口的默认方法与静态方法,也就是接口中可以有实现方法
public class Test {
public static void main(String[] args) {
Formula a=new For();
a.calculate(1);
System.out.println(a.sqrt(8));
}
interface Formula {
double calculate(int a);
default double sqrt(int a) {//这个方法可以在实现类重写,或者直接使用
return Math.sqrt(a);
}
}
static class For implements Formula{
@Override
public double calculate(int a) {
return 0;
}
@Override
public double sqrt(int a) {
return 0;
}
}
}
package com.ming.jdk18; /**
*
* @author mingge
* jdk1.8接口支持静态方法与默认方法
*
*/
public interface TestInterface { //这个是默认方法
default String get(String aa,String bb){
System.out.println("我是jdk1.8默认实现方法...");
return "";
} String aa="2222"; //这个是静态方法
static void staticmethod(){System.out.println("我是静态方法"+aa);}
}
package com.ming.jdk18;
public class Main {
public static void main(String[] args) {
TestInterface.staticmethod();
}
}
以前的版本定义接口是不能有实现机制的,现在这样用了一个default关键字后,就可以实现,然后子类可以重写,也可以直接使用了。好处多多,感觉有点抽象类了...越来越灵活了。加入静态方法后,你以后的工具类就可以参考接口来设计啦.这是一个优点啦.
二、Lambda 表达式
public class Test {
public static void main(String[] args) {
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {//java以前老版本的写法
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
for(String name:names){
System.out.println(name);
}
}
}
只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。
在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
复制代码 代码如下: 5 Collections.sort(names, (String a, String b) -> {
6 return b.compareTo(a);
7 }); 看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:
复制代码 代码如下: Collections.sort(names, (String a, String b) -> b.compareTo(a)); 对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:
复制代码 代码如下: Collections.sort(names, (a, b) -> b.compareTo(a)); Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看lambda表达式还能作出什么更方便的东西来:
lambda表达式的使用简化了代码。
三、函数式接口与静态导入
Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。
因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
public class Test {
public static void main(String[] args) {
Converter<String, Integer> a = (from) -> Integer.valueOf(from);
//Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用
Converter<String, Integer> converter = Integer::valueOf;//这个是静态方式导入
Integer m=a.convert("123");
System.out.println(m);
test test=mmm -> "aaaa";//mmm代表你要传入的参数
String testResult=test.aa("");//aa代表你要传入的方法
System.out.println(testResult);
}
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
interface test{
String aa(String mmm);
}
//使用函数式接口时,接口的定义只能有一个,@FunctionalInterface注解可有可无
}
四、Lambda 作用域
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
五、访问局部变量
public class Test {
public static void main(String[] args) {
final int num = 1;
Converter<Integer, String> stringConverter =
(from) -> String.valueOf(from + num);
String str=stringConverter.convert(2);
System.out.println(str);//输出3
//final关键字可以去掉,但是默认是存在的,所以,对num变量不能再次赋值修改
}
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
}
六、访问对象字段与静态变量
public class Test {
public static void main(String[] args) {
Lambda4 lambda4=new Lambda4();
lambda4.testScopes();
}
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
static class Lambda4 {
static int outerStaticNum=0;
int outerNum=0;
void testScopes() {
Converter<Integer, String> stringConverter1 = (from) -> {
outerNum = 23;
return String.valueOf(outerNum);
};
String a=stringConverter1.convert(outerNum);
System.out.println(a);//输出23
Converter<Integer, String> stringConverter2 = (from) -> {
outerStaticNum = 72;
return String.valueOf(outerStaticNum);
};
}
}
//这里的意思是outerStaticNum与outerNum两个参数可以多次赋值
}
java1.8的几大新特性(一)的更多相关文章
- java1.8的几大新特性(二)
七.Date APIJava 8 在包java.time下包含了一组全新的时间日期API.新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部 ...
- java1.8十大新特性详解
"Java is still not dead-and people are starting to figure that out." 本教程将用带注释的简单代码来描述新特性,你 ...
- HTML5的几大新特性
为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...
- java1.8 10大新特性
http://blog.csdn.net/u013598111/article/details/49720867 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 d ...
- 接口详解例子代码(附Java1.8的接口新特性)
接口,与抽象类类似但是区别也很大,他们都是标签,用来提醒父类一定要实现的类里创建抽象方法.而接口类可以implements 多个接口,抽象类则只能父类只能继承一个抽象类,与抽象不同的是它不是继承组合关 ...
- java1.7新特性:try-with-resources
转载:https://blog.csdn.net/fanxiaobin577328725/article/details/53067163 首先看代码: import org.junit.Test; ...
- 可变参数列表-Java SE5新特性(转)
Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持 ...
- java1.8新特性(一)
一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api 引起注意的还是 关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什 ...
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
随机推荐
- iOS启动图片适配问题
Portrait 是竖屏 top home button Landscape是横屏 left home button retina 要求640x1136pixels, 在右边的Image属性 Expe ...
- C#下如何用NPlot绘制期货股票K线图(1)?
[简介] 作为一名专业程序化交易者,编程是一个程序员的基本功,本文是作者在做的一个期货CTP项目中有关K线绘图的一部分,偿试类MT4中图表 设计而写,在编写绘图时,查阅了相关资料,感觉还是用NPlot ...
- Web前端新人笔记之HeightCharts基础
通常情况下,Highcharts包含标题(Title).坐标轴(Axis).数据列(Series).数据提示框(Tooltip).图例(Legend).版权信息(Credits)等,高级的还包括导出功 ...
- Java实战之03Spring-05Spring中的事务控制(基于AOP)
五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1. ...
- 10_控制线程_线程让步yield
[线程让步yield()方法] yield()方法可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程从运行状态转入就绪状态. 只是让当前的线程暂停一下,让系统的线程调度器重新调度一次. ...
- 2D游戏模型中动态分层的处理 及解决方案 (适用于 webgame 手游等资源控制较严格类型)
文章若非特别注明转载,皆是原创,转载请注明出处. 本文地址:http://www.cnblogs.com/bobolive/p/3537215.html 2D游戏中模型一般都有换装逻辑,特别是联网游戏 ...
- jQuery Mobile里xxx怎么用呀?(控件篇)
jQuery Mobile里都有什么控件? http://api.jquerymobile.com/category/widgets/ jQuery Mobile里slider控件的change事件怎 ...
- Cassandra1.2文档学习(8)—— 数据管理
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_manage ...
- 一些web编程能用到的小知识
1 信用卡验证算法-luhn算法.(in django/utils/checksums.py) 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加.2.将偶数位数字相加,但是这里有个麻烦. ...
- Nginx+uWSIG+Django+websocket的实现
1.Django+websocket django-websocket dwebsocket django-websocket是旧版的,现在已经没有人维护,dwebsocket是新版的,推荐使用dwe ...