[Java基础] Java8新特性
一:函数式编程
lambda表达式:
Runnable run = () -> { //逻辑代码 };
归根结底,lambda表达式就是一个类似于匿名内部类的语法糖,只不过不会像匿名内部类一样制造一个新的内存空间;这个表达式一般是用于函数式编程的,把方法当作参数,传给另一方法,主要关注点在参数列表和返回值里,
所以产生了一下几种用法:
1. () -> {}; 当此方法无参数时使用
2.x -> {}; 当此方法有一个参数时使用
3.(x1,x2,x3) -> {}; 当此方法有多个参数时使用
Java开发人员认为如果就这样使用lambda太过浪费了,于是产生了四大函数式编程接口(只有一个方法的接口):
1.Consumer<T> : void accept(T t); 消费型函数接口,参数列表为传入一泛型,无返回值.
2.Supplier<T>: T get(); 供给型函数接口,参数列表为空,返回值为一泛型;
3.Function<T,R>: R apply(T t),操作型函数接口,参数列表为一泛型,返回值为另一泛型;
4.Predicate<T>: boolean test<T t>,断言型函接口,参数列表为一泛型,返回值为布尔值;
总的来说,使用lambda表达式要对函数式的返回值和参数列表要有充分的了解,以及什么时候能用
方法的引用:
类::静态方法
类::实例方法
类::new
对象::实例方法
引用也是另一形态的语法糖,进行了方法的另一种调用,可以调用静态方法和实例方法和构造方法
二:Stream
Stream 为Java8新加入的API 为一些集合操作提供了更大的便利
操作类型分为 Intermediate / Terminal / Short-circuiting
i.惰化操作,将一堆数据进行某种程度上的数据过滤或者映射然后赋给一个新的流,主要目的是打开流,一个流后面可以跟0-n个惰化操作
ii.真正的使用流的操作,可以认为在一个流进行了Terminal后,这段流才真正的开始被遍历,然后这段流就结束了被使用光了,无法再被操作,所以Terminal一般都放在对流操作的最后一步操作
iii.对一个Intermediate完成后的类,进行限制,如limit() 把这个流截断,用于把一个太长的流进行限制,或者对一个在进行Terminal操作的流限制它操作的时间
流的使用: 简单来说就是进行 filter-map-reduce 操作后 制造出一个结果或者副作用(side effect)
1.流的创建:
Stream.of()
集合.stream()
Stream.iterator()
Stream.generate()
2.流的中间操作:
filter()
boxed()
limit()
sorted()
distinct()
3.流的终止操作:
collect()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署