Java8新特性
Posted tongstudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8新特性相关的知识,希望对你有一定的参考价值。
Java 8新特性
lambda表达式
函数式编程思想:强调做什么,而不是怎么做. 只要能获取结果,谁去做怎么做不重要,重要的是结果,而不是过程.
面向对象:做一件事就去找能做这个事的对象,调用对象的方法去完成事情
==原本冗余的代码可以更加清楚,减少代码量==
Runnable接口实现多线程, 匿名内部类----
Lambda表达式的标准格式
他省去了面向对象的条条框框,右三部分组成
- 一些参数
- 一个箭头
- 一段代码
(参数类型 参数名称)->{代码语句}
省略规则:
- 小括号内的参数类型可以省略
- 如果小括号里有且仅有一个参数,那么小括号也可省略
- 如果大括号有且仅有一个语句,无论是否有返回值,都可以省略大括号,return关键字及语句分好
使用前提:
- 使用lambda必须具有接口,且要求接口中只有一个方法
- 使用lambda必须具有上下文推断
函数式接口:
概念: 有且只有一个抽象方法的接口
语法糖! 指使用更加方便,但是原理不变的代码语法,例如for each 其实底层原理就是迭代器,,应用方面Java中的lambda就是匿名内部类的语法糖!
@FunctionalInterface注解
表示,只要用这个注解,编译器就会强制的检查接口是否确实只有一个方法,否则就会报错.
lambda的延迟执行
public class TestDelayedExecute {
//性能浪费的日志案例
private static void log(int level ,String msg){
if (level==1){
System.out.println(msg);
}
}
//利用lambda表达式延迟执行
private static void log2(int level,MessageBuilder printMsg){
if (level ==1){
System.out.println(printMsg.printMsg());
}
}
//测试
public static void main(String[] args) {
String msgA = "I ";
String msgB = "Love ";
String msgc = "Java";
log(1,msgA+msgB+msgc);
log2(2,()->{
System.out.println("我是执行了的Lambda");
return msgA+msgB+msgc;
});
}
}
@FunctionalInterface
interface MessageBuilder{
String printMsg();
}
lambda作为参数和返回值
常用的函数式接口
被提供主要在java . util. function包中
supplier接口 只有一个无参的方法 表示生产一个数据
Consumer接口 与supplier相反 ,为消费一个数据
Predicate接口
Function接口
Stream流及方法引用
stream流不同于IO流是一个完全不一样的概念
流式思想 : 类似于工厂车间的"生产流水线"
stream流的获取:
collection集合都可以通过stream流来获取
- 根据collection来获取
- 根据map来获取
- 根据数组来获取
stream流的方法
延迟方法:返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方 法均为延迟方法。)
终结方法:返回值类型不再是 Stream 接口自身类型的方法,因此不再支持类似 StringBuilder 那样的链式调 用。本小节中,终结方法包括 count 和 forEach 方法。 **
forEach:逐一处理
filter:过滤
count: 统计个数
limit:取用前几个
skip 跳过前几个
contact: 组合
方法的引用
冗余的lambda场景
双冒号
::
为引用运算符,而在表达式中被称为 方法引用
以上是关于Java8新特性的主要内容,如果未能解决你的问题,请参考以下文章