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& ...
随机推荐
- 2013年全国各大著名的IT公司薪资待遇大揭密
以下为转载,特此说明!--西电好网 ============================================ 1: 本人西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇 ...
- 全面认识网络诊断命令功能与参数——netsh diagnostic命令
netsh diagnostic是网络诊断命令,主要检测网络连接和服务器连接的状态. 注意:netsh不能在Window2000以下系统中使用.案例1:使用netsh diagnostic命令检 ...
- 【mysql】【分组】后取每组的top2
DROP TABLE IF EXISTS `tb1`; CREATE TABLE `tb1` ( `id` ) NOT NULL AUTO_INCREMENT, `a` ) DEFAULT NULL, ...
- 关于insertBefore
insertBefore,看名字就是在某个元素前插入元素,但是其实它可以再文档任何元素强势插入. insertBefore用法: parent.insertBefore(newChild, refCh ...
- redis 入门笔记(一)
redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的web应用程序的完美解决方案 三个主要特点: 1,Redis数据库完全在内存中,使用磁盘仅用于持久性 ...
- android驱动程序之 - sensor
上图是android系统架构图,从中可以得知,sensor必贯穿架构的各个层次.按照架构层次,下面从五个方面来分析sensor架构: 1. sensor架构之App层: 2. sensor架构之Fra ...
- Web前端新人笔记之jquery入门
本章将为大家介绍以下几点内容: 1.jquery的主要特点: 2.建立jquery的编码环境: 3.简单jquery脚本示例: 4.选择jquery而不是纯javaScript的理由: 5.常用的jq ...
- 简单的JQuery分页代码
1. [代码][JavaScript]代码 001 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...
- SQL Server代理服务无法启动的处理方法(转载)
SQL Server代理服务无法启动问题的确很让我们头疼,下面就为您介绍SQL Server代理服务无法启动的处理方法,希望对您能有所帮助. --==配置环境服务器环境为32位Intel® Xeon® ...
- Visual Studio 2010下载 + 附破解方法
Visual Studio 2010下载 + 附破解方法 1.Microsoft Visual Studio 2010下载 旗舰版(Ultimate) http://download.microsof ...