1、函数式接口
定义:只包含一个抽象方法的接口,称为函数式接口
常见的函数式接口举例:
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检
查它是否是一个函数式接口。比如我们创建一个接口,里面定义两个抽象方法后家上注解,但是这样会发现编译就会报错,因为它并不是函数式接口
2、Lambda表达式(重点)
表达式语法:
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。
这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:
- 左侧:指定了 Lambda 表达式需要的参数列表
- 右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即
Lambda 表达式要执行的功能
举例:

Lambda表达式本质:
就是接口实现类对象,接口必须是函数式接口(可以理解为只有一个抽象方法的接口)
总结:Lambda表达式针对的是函数式接口,当我们想要为接口提供实现类对象时,可以使用该表达式,由于接口只有一个抽象方法,所以我们创建使用表达式时候就不需要知道方法名字是什么,不会有歧义!
3、方法引用
方法引用可以看做是Lambda表达式深层次的表达。
换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的另一种形式
使用场景:
实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
说白了,就是函数式接口的参数类型+返回值类型与别的类方法的参数类型+返回值类型一样,才可以使用方法引用
如下主要使用情况:
对象::实例方法名
类::静态方法名
代码举例:
@FunctionalInterface
public interface LambdaTest {
String interMethod(String a);
}
class MethodClass {
public String claMethod1(String a) {
return a;
}
public static String claMethod2(String a) {
return a + "hello";
}
public String claMethod3(String a) {
System.out.println(a);
return a;
}
}
class TestClass {
public static void main(String[] args) {
//LambdaTest test1 = a -> a;
//1.对象::实例方法名
MethodClass methodClass = new MethodClass();
LambdaTest test1 = methodClass::claMethod1;
System.out.println(test1.interMethod("yes"));
//2.类::静态方法名
LambdaTest test2 = MethodClass::claMethod2;
System.out.println(test2.interMethod("world"));
}
}
4、Stream流(重点)
Stream流作用:简而言之一句话,Stream是程序员非常简便丝滑的操作集合
Stream流的学习主要就是三步:
数据源 ——> 数据处理 ——> 收集结果
数据源就是Stream流想要处理的数据,例如List集合
数据处理就是Stream流对数据进行相应的处理
收集结果就是处理后的结果进行收集
代码举例:
public class StreamApi {
public static void main(String[] args) {
//1.filter过滤:把list中长度大于5的字符串输出
List<String> list = Arrays.asList("Hello", "World", "Java");
list.stream().filter(str -> str.length() > 4).forEach(str -> System.out.println(str));
//2.limit范围:list中只选前两个数据输出
list.stream().limit(2).forEach(str -> System.out.println(str));
//3.sorted排序:将list排序进行输出(默认升序,方法中传Comparator.reverseOrder()进行降序排列)
List<Integer> numList = Arrays.asList(1, 1, 6, 2, 3, 5, 4);
numList.stream().sorted().forEach(num -> System.out.println(num));
//4.map映射:把一个流中的元素转化成新的流中的元素,比如这里将list中int元素变成字符串然后输出
//把 Stream<Integer> 的流转成一个 Stream<String> 的流
numList.stream().map(num -> num + "").forEach(num -> System.out.println(num));
//5.reduce:把 Stream 中的元素组合起来
Integer result = numList.stream().reduce((sum, num) -> sum += num).get();
//6.collect:基于目标集合生成新的集合,这里我们取出所有偶数
List<Integer> collect = numList.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
//7.distinct:去重list中数据
List<Integer> disList = numList.stream().distinct().collect(Collectors.toList());
}
}