标签:Optional 接口 参数 println new 方法 java8 表达式 Lambda
Lambda表达式
当需要启动一个线程去完成任务时,代码量太多了,只有run方法体才是关键。jdk8就加入了lambda表达式。
public class Demo01Runnable {
public static void main(String[] args) {
// 匿名内部类
Runnable task = new Runnable() {
@Override
public void run() { // 覆盖重写抽象方法
System.out.println("多线程任务执行!");
}
};
new Thread(task).start(); // 启动线程
}
}
简化的lambda表达式:new Thread(() ‐> System.out.println("多线程任务执行!")).start(); // 启动线程
1.有且仅有一个抽象方法的接口,称为“函数式接口,使用Lambda必须具有上下文推断。也就是方法的参数或方法的返回值类型是一个函数式接口,才能使用Lambda作为该接口的实例。
2.lambda表达式格式
(参数类型 参数名称) ‐> { 代码语句 }
- 1. 小括号内参数的类型可以省略;
- 2. 如果小括号内有且仅有一个参,则小括号可以省略;
- 3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
3.@FunctionalInterface注解,用于一个接口的定义,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod();
}
注意:lambda表达式中访问的局部变量是final的,
因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。
int b = 3;
System.out.println(testFunction((String i) -> b+1+Integer.valueOf(i),"3"));
// b =5; 如果加上这个,编译就会报错,在jdk8中局部变量没有显示定义成final,他也会编译成final的。
4.常用函数式接口
例子:
private static void consumeString(String s,Consumer<String> function) {
function.accept(s);
}
public static void main(String[] args) {
consumeString("zhouyang",(s) -> {
System.out.println("消费了一个数据:"+s);
});
其他接口
5.方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来
对象::实例方法
例子:(x) -> System.out.println(x); 等同于 System.out::println 抽象方法参数是x,system的println方法参数也是x,所以可以这样引用
类::静态方法
(x,y) -> Math.pow(x,y) 等同于Math::pow
类::实例方法 当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时:
ClassName::methodName compare((x,y) -> x.equeals(y),"a","b") 等同于 compare(String::equals,"a","b")
6.构造器引用
可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
ClassName::new 例子: (n)-.new MyClass(n);等同于 Myclass::new
7.数组引用
type[] :: new
例子:(n)-.new Integer[n];等同于Integer[]::new
Stream流
1.Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。stream自己不会存储元素,不会改变源对象,会返回一个新的stream
2.stream的操作步骤
创建 Stream
一个数据源(如:集合、数组),获取一个流
Ayyays.stream(数组) collection.stream() 返回一个顺序流 collection.parallelStream() 返回一个并行流 Stream.of(T... values)
中间操作
一个中间操作链,对数据源的数据进行处理
筛选与切片
映射
排序
终止操作(终端操作)执行中间操作链,并产生结果
Stream 的终止操作
查找与匹配
归约
收集
jdk8的新特性,接口中的默认方法和静态方法。
Optional 类
Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,
原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且
可以避免空指针异常。
常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
标签:Optional,接口,参数,println,new,方法,java8,表达式,Lambda
来源: https://www.cnblogs.com/zhouyanger/p/13557664.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。