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& ...
随机推荐
- SQLserver中的常量与变量、判断循环语句
数据库中的变量与常量 数据库中定义变量 [起临时存储数据的作用] ---数据库中定义变量(运行时要从头到尾进行运行,从定义变量开始到赋值) --前面必须加 declare --定义变量 : de ...
- Java实战之03Spring-04Spring的数据库访问
四.Spring的数据库访问 1.DAO模式 /** * 抽取的一个类 * @author zhy * */ public class JdbcDaoSupport { private QueryRu ...
- 2016ACM竞赛训练暑期课期末考试 a题
描述 给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合. 输入 第一行是一个正整数n(n<=600).第二行是n个不同的整数,相邻两个整数之间用单个空格隔开. ...
- Arithmetic Expression
时间限制:2000ms 单点时限:200ms 内存限制:256MB 描述 Given N arithmetic expressions, can you tell whose result is cl ...
- c++中动态尾随内存的技巧和定位new
c 和 c++ 最大的特点就是对内存的自由操作,数据类型,其实都是对内存的一种解释方式.C语言中常用的一个技巧就是尾随数据,网络编程中经常会用到这个特性, 特别是以前写完成端口的时候,这个特性肯定是会 ...
- 在Mac OS X中使用VIM开发STM32(3)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在上一篇文章中,我们安装了ctags插件,ctags能对我们的源代码文件中的元素建立索引表, ...
- 一套帮助你理解C语言的测试题(转)
前言 原文链接:http://www.nowamagic.net/librarys/veda/detail/775 内容 在这个网站(http://stevenkobes.com/ctest.html ...
- MongoDB的timezone问题
MongoDB是以UTC格式来存储所有时间的,查询的时候也是返回UTC时间,不提供在数据库连接级别的timezone支持,这就带来一个问题:无法使用groupby对日期进行聚合,因为你所在的timez ...
- 判断浏览器是否支持某个css3属性的javascript方法
判断浏览器是否支持css3某个属性的方法: /** * 判断浏览器是否支持某一个CSS3属性 * @param {String} 属性名称 * @return {Boolean} true/false ...
- Java遍历所有网卡打印对应IP
import java.util.Enumeration; import java.net.*; public class Test { /** * @param args */ public sta ...