jdk1.8新特性详解,jdk7新特性详细
函数式编程
面向对象强调“一切都是对象”。想做一件事,就要找一个对象去做。函数式编程强调“做什么”而不是“怎么做”。
普通的开启线程
//匿名内部类对象
Runnable task=new Runnable() {
@覆盖
公共无效运行(){
System.out.println(乌鸦飞);
}
};
新线程(任务)。start();更多与java相关的免费视频教程:java在线教程
函数式编程开启线程
new thread(()-system . out . println(龙卷风摧毁停车场))。start();前面的括号:方法参数。如果没有参数,则编写()。箭头指向以后要做的事情。箭头后面就像一个方法体大括号,代表要做的具体内容。
Lambda表达式
Lambda expression又称闭包,是推动Java 8发布的最重要的新特性。
Lambda允许函数作为方法的参数(函数作为参数传递到方法中)。使用Lambda表达式可以使代码更加简洁紧凑。
三要素:参数、箭头 、代码
格式:(参数类型参数名称)-{某代码}
使用Lambda表达式的前提:必须有一个接口,并且接口中只有一个抽象方法。
演示:用makeFood()方法编写一个Cook接口。
公共静态void main(String[] args) {
方法(()- {
System.out.println(闪刀启动!);
});
}
私有静态空方法(Cook cook) {
cook . make food();
}Lambda表达式省略规则:
参数可以省略。但是,所有参数的类型只能同时省略,或者根本不省略。如果只有一个参数,括号可以省略。如果大括号中只有一个语句,则无论是否有返回值,都可以省略回车、大括号和分号。
公共静态void main(String[] args) {
方法((a,b)-a b);
}
私有静态void方法(计算器计算器){
int result=calculator.sum(1234,9876);
System.out.println(结果);
}创建接口时,也可以使用lambda表达式,而不是匿名内部类。
runnable task=()-system . out . println(闪刀启动!);
新线程(任务)。start();函数式接口
接口只有一个抽象方法,叫做函数接口。
JDK8中增加了注释@FunctionalInterface来检查一个接口是否是功能接口。如果它不是一个函数接口,编译时会报告一个错误。@ functionalinterface注释是可选的。即使不使用这个注释,只要保证接口满足功能接口的定义要求,也是功能接口。
@功能界面
公共接口MyInterface {
void方法();
}方法引用
printer printer=(str)-system . out . println(str);这段代码实际上可以缩写。
只要是可导的,就可以被引用,所以传递引用是没有意义的。因此,在这里实际上可以使用方法引用来缩写System.out:println。
从java8开始,引入了一个全新的运算符,method reference(两个冒号写在一起),它所在的表达式是一个方法引用。方法引用的本质和Lambda完全一样,目的是简化Lambda表达式的编写。
Lambda: s-System.out.println(s)的拼写
方法参考编写:System.out:println
两种发型完全等同。
公共静态void main(String[] args) {
方法(system . out:println);
}
私有静态void方法(打印机打印机){
printer . print( hello );
}接口
default方法
接口本来是两个抽象方法,现在需要变成三个抽象方法。这时它的实现类也需要实现新的方法。
实现类太多的时候,操作起来很麻烦。在JDK之前,它采用了开放-封闭的设计模式:对扩展开放,对修改封闭。即创建一个新的接口,继承原来的接口,定义一个新的方法。但是,在这种情况下,原来的实现类没有新方法,所以可以使用接口默认方法。
用关键字default修饰的方法需要方法体。这个方法的所有子类都会默认实现(不用自己写)。如果要重写重写,可以在实现类中重写重写。
/**
*从java8开始,该接口允许您定义默认方法。
*修饰符:public default(public可以省略,default不能省略)
*/
公共接口MyInterface {
void方法1();
void方法2();
默认void方法New() {
System.out.println(接口默认方法执行);
}
}注意:接口中的default方法相当于是一个新的关键字,和四种修饰符的“default”并非一个概念。
通过使用默认关键字,程序可以达到“多重继承”的效果。
static方法
从java8开始,接口中允许定义静态方法,用法和一般类的静态方法一样。
公共接口动物{
void eat();
静态动物getAnimal() {
返回新的Cat();
}
}流式操作
开发人员对流式处理的第一感觉是,它使收集操作简单多了。通常我们需要多行代码才能完成的操作,借助流处理可以在一行中实现。
例如,如果我们想从一个包含整数的集合中过滤出所有偶数,并将它们封装成一个新的列表返回,那么在java8之前,我们需要通过下面的代码来实现:
对于num集合:
list integer evens=new ArrayList();
for(最终整数个数:nums) {
if (num % 2==0) {
evens . add(num);
}
}通过java8中的流处理,我们可以将代码简化为:
ListInteger evens=nums.stream()。过滤器(数量% 2==0)。collect(collectors . to list());首先简单解释一下上面这句话的意思。stream()操作将集合转换成流,filter()执行我们的自定义过滤处理。在这里,所有偶数都被lambda表达式过滤掉。最后,我们通过collect()封装结果,并将其封装指定为通过Collectors.toList()返回的列表集。
常见操作案例:
//初始化列表集合
ListString list=new ArrayList string();
List.add(测试数据1 );
List.add(测试数据2 );
List.add(测试数据3 );
List.add(测试数据12 );
//使用表达式遍历集合
list . foreach(s-system . out . println(s));
//使用谓词和过滤条件过滤元素。
predicate string contain 1=n-n . contains( 1 );
predicate string contain 2=n-n . contains( 2 );
//根据条件遍历集合
list.stream()。过滤器(容器1)。forEach(n-system . out . println(n));
list.stream()。过滤器(包含1个测试)。forEach(s-system . out . println(s));
list.stream()。过滤器(容器1和容器2)。forEach(n-system . out . println(n));
list.stream()。过滤器(容器1或容器2)。forEach(n-system . out . println(n));
//将筛选的元素放回集合中
ListString newList=list.stream()。过滤器(容器1和容器2)。collect(collectors . to list());
集合的小数和
BigDecimal sum=list。流()。地图(Person:getAmount)。reduce(BigDecimal:add)。get();
//排序,也需要一个新的集合来接收
list student result list=new ArrayList student();
结果=list.stream()。已排序(comparator.com帕林(student: getage))。Collect (collectors.tolist())推荐java相关文章:java Zero Foundation入门。
欢迎大家一起学习!以上是JDK8新特性的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。