Lambda表达式
Lambda 表达式是 Java1.8 增加的特性,它为函数式接口服务,所以在学 Lambda 表达式之前,首先要弄清楚什么是函数式接口
函数式接口的特征
函数式接口被 @FunctionalInterface注解所修饰,向 Java 表示这是一个函数式接口
接口内有且只能有一个尚未完成的缺省属性为 public abstract 修饰的方法,在 Java1.8 中,接口内被 default 关键字修饰的方法可以有方法体。
Lambda表达式的格式
(方法参数)-> { 方法体 }
当参数为一个的时候可以省略小括号,当方法体为一行代码时,大括号可以省略
函数式接口中的方法可以分为四种:
无参无返回值
() -> {方法体} //小括号不可以省略
有参无返回值(消费者)
(参数列表) -> {方法体} //参数为一个的时候可以省略小括号
无参有返回值(生产者)
() -> {方法体} //方法体内必须要有return语句
☆有参有返回值
(参数列表) -> {方法体} //参数为一个的时候可以省略小括号,方法体内必须要有return语句
学习了Lambda表达式,我们在什么场景下使用呢?
//首先声明一个函数式接口
@FunctionalInterface
interface A {
void run(String str);
}
class Dog {
void sport(String str ,A a) {
a.run(str);
}
}
public static void main(String[] args){
Dog dog = new Dog();
dog.sport("今天做什么运动呢?"
// 这里其实对应了A接口的具体实现类
, s -> System.out.println(s + " 不如去跑步吧");//Lamvda表达式
);
}
//输出结果:今天做什么运动呢? 不如去跑步吧
ps:当你遇到接口中只有一个尚未完成的方法时,就可以使用 Lambda 表达式来省略写实现类,能提高代码性能,但缺点是这个实现类一般只能使用一次,如果想要多次用,还是要做实现类,封方法的
Java中常用的接口
@FunctionalInterface
interface Comparator<T> {
/**
* 比较器接口
* 要求的方法,参数是泛型参数,用户指定类型
*/
int compare(T o1, T o2);
}
// 过滤器接口,判断器接口,条件接口
@FunctionalInterface
interface Predicate<T> {
/**
* 过滤器接口
* 约束的方法,方法参数是用户使用时约束泛型对应具体数据参数
*/
boolean test(T t);
}
// 类型转换器接口,做类型之间的转换
@FunctionalInterface
interface Function<T, R> {
R apply(T t);
}
Stream流
Stream流是在JDK1.8版本以及之后版本所支持的对集合或数组进行操作的工具,对数组分割排序等操作都肥肠方便
Stream流常用方法
Stream<T> skip(long n);
限制跳过当前 Stream 流对应元素的个数,【掐头】
Stream<T> limit(long n);
限制当前 Stream 对应的元素总个数,【去尾】
Stream<T> sorted();
对当前 Stream 流存储的进行排序操作
,要求元素有自然顺序或者遵从 Comparable 接口,默认【升序】
Stream<T> sorted(Comparator<? super T> com); 重点
对当前 Stream 流存储的进行排序操作,排序规则由 Comparator 函数式接口规范
Stream<T> filter(Predicate<? super T> pre);
判断过滤当前 Stream 流可以保存的数据条件,满足条件保留
,不满足条件移除,过滤规则由 Predicate 接口约束
Stream<T> distinct();
当前 Stream 流中对应的所有元素去重擦操作
Stream<R> map(Function<T, R> fun);
当前 Stream 存储的数据情况转换为 Function 函数式接口要求的返回值类型
,完成类型转换操作。
Stream流的终止方法,在执行这些方法后,Stream流会被直接关闭,等待被JVM回收
long count();
返回当前 Stream 流对应的数据元素个数,为终止方法。
void forEach(Consumer<? super T> con);
针对于当前 Stream 存储元素的处置方法,为终止方法。
<R, A> R collect(Collector<? super T, A, R> collector);
Stream 流对应的元素存储内容,转换为用户要求的 集合对象。终止方法
常用:
☆ Collectors.toList() 目标存储集合类型为 List 集合
☆ Collectors.toSet() 目标存储集合类型为 Set 集合
Object[] toArray();
Stream 流存储的元素内容转换为 Object 类型数组返回
实例操作
ArrayList<String> list = new ArrayList<>();
list.add("01211");
list.add("123");
list.add("23411");
list.add("345");
list.add("4561");
list.add("567");
list.add("678222");
list.add("789");
System.out.println();
list.stream()
.skip(2)
.limit(6)
.filter(s -> s.length() > 3)
.sorted(Comparator.comparing(String::length))
.forEach(System.out::println);
//结果是
4561
23411
678222
Process finished with exit code 0
如有不足,私信或者评论指正,肥肠感激。🙋