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& ...
随机推荐
- ###《Max-Margin Early Event Detectors》
Paper reading. #@author: gr #@date: 2014-03-11 #@email: forgerui@gmail.com Early Detection Abstract: ...
- invalid code signing entitlement的通用暴力解决办法
1.添加的一台苹果设备为开发机子后,打版本,说profile 没找到,报错 2.上传二进制文件到itunes connect ,报错 3.有时候还什么 appID 无效,报错 烦死他了 我的解决办法, ...
- 2.1 JavaScript应用开发实践指南
创建交互层 循环 示例代码如下: var people = family, peopleCount = items.length, i; if(peopleCount>0){ for(i=0; ...
- props验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WPF设置窗口模式(Windowstyle=“None”)
当WindowStyle="None"时,设置AllowsTransparency="True",则不会出现黑色Border,然后可以另外设置外边的Border ...
- ubuntu12.04 U盘自动挂载配置
Ubuntu12.04禁止U盘等设备的自动挂载方法如下: 在图形界面(字符界面无效)内进入系统终端,ctrl+alt+T或者gnome-terminal 禁止自动挂载:$ gsettings seto ...
- Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)
函数,数组,指针,gdb调试器 1.函数定义 如果明确指定返回类型,默认为int 参数传递:实参对形参的参数传递是单向的,实参只是把自己的值赋给形参. 形参的 ...
- Newtonsoft.Json.dll解析json的dll文件使用
要解析的json //解析前 //解析前 {,,,,,,,,,,},,,,,,,,,,,},,,,,,,,,,,,,,,,},,,,,,,,,},,,,,,,,,,,,},,,,,,,,,,,},,, ...
- 前端资源多个产品整站一键打包&包版本管理(一)
来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们 ...
- 发光的input框(纯css实现)
css代码: input{width: 200px;height: 40px;} input.focus{border-color: #08c;box-shadow: 0 0 4px #8bd6fb; ...