java8 Lambda表达式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java8 Lambda表达式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4125字,纯文字阅读大概需要6分钟。
内容图文
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
?
内容总结
以上是互联网集市为您收集整理的java8 Lambda表达式全部内容,希望文章能够帮你解决java8 Lambda表达式所遇到的程序开发问题。
如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
来源:【匿名】