Java8常用特性:Lambda、Stream流、方法引用、函数式接口

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());
    }
}

版权声明:本文为weixin_46594796原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。