1.什么是lambda表达式
lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。
它是一个匿名函数,即用即扔。
2.函数式接口(一个只有一个抽象方法(不包含object中的方法)的接口。)
//这个是函数式接口
interface eat
{
void eatFood();
}
//这个不是是函数式接口
interface eat
{
default void eatFood()
{
System.out.println("hello");
};
}
//这个是一个函数式接口
interface eat
{
void eatFood();
String sleep();
}
对于是否是函数式接口,java8中也提供了一个专用的注解:@FunctionalInterface。通过这个注解,可以确定是否是函数式接口:
//此处会报编译错误
@FunctionalInterface
interface eat
{
default void eatFood()
{
System.out.println("eat.........");
};
}
3.Lambda表达式语法
左侧 : Lambda 表达式的参数列表
右侧 : Lambda 表达式中所需执行的功能
() -> System.out.println(“Hello Lambda!”);
4.作用
(1).替代匿名内部类
匿名内部类:
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("old runable!");
}
}).start();
}
//结果:old runable!
lambda表达式:
public void run() {
new Thread(() -> System.out.println("lambda function!")).start();
}
//结果:lambda function!
(2)对集合进行迭代
public void iterTest() {
List<String> stringLists = List.of("apple", "banana", "cherry", "date", "fig", "grape");
//java8之前使用增强for循环
for(String stringList:stringLists) {
System.out.println(stringList );
}
//java8之后
stringLists.forEach(stringList -> System.out.println(stringList));
stringLists.forEach(System.out::println);
}
(3)Stream操作(流操作)
Stream它像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。
Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。
1)filter(过滤)
list.stream()//将集合转换为流
.filter(s -> s.length() > 3)//过滤长度大于3的字符串
2)Map(映射)
如果想通过某种操作把一个流中的元素转化成新的流中的元素,可以使用 map() 方法。
public class MapStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("周杰伦");
list.add("王力宏");
list.add("陶喆");
list.add("林俊杰");
Stream<Integer> stream = list.stream().map(String::length);
stream.forEach(System.out::println);
}
}
//结果:
3
3
2
3
map() 方法接收的是一个 Function(Java 8 新增的一个函数式接口,接受一个输入参数 T,返回一个结果 R)类型的参数,此时参数 为 String 类的 length 方法,也就是把 Stream 的流转成一个 Stream 的流。
3)limit(截断)
对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素
4)distinct(去重)
对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素
5)count(统计)
count方法是一个流的终点方法,可使流的结果最终统计,返回int,比如我们计算一下满足18岁的总人数