0


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

文章目录

1、函数式接口

定义:只包含一个抽象方法的接口,称为函数式接口

常见的函数式接口举例:
在这里插入图片描述

我们可以在一个接口上使用

@FunctionalInterface

注解,这样做可以检
查它是否是一个函数式接口。比如我们创建一个接口,里面定义两个抽象方法后家上注解,但是这样会发现编译就会报错,因为它并不是函数式接口
在这里插入图片描述

2、Lambda表达式(重点)

表达式语法:
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。
这个操作符为 “

->

” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:

  • 左侧:指定了 Lambda 表达式需要的参数列表
  • 右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能

举例:
在这里插入图片描述
在这里插入图片描述
Lambda表达式本质:
就是接口实现类对象,接口必须是函数式接口(可以理解为只有一个抽象方法的接口)

总结:Lambda表达式针对的是函数式接口,当我们想要为接口提供实现类对象时,可以使用该表达式,由于接口只有一个抽象方法,所以我们创建使用表达式时候就不需要知道方法名字是什么,不会有歧义!

3、方法引用

方法引用可以看做是Lambda表达式深层次的表达。
换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的另一种形式

使用场景:

实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
说白了,就是函数式接口的参数类型+返回值类型与别的类方法的参数类型+返回值类型一样,才可以使用方法引用

如下主要使用情况:

对象::实例方法名
类::静态方法名

代码举例:

@FunctionalInterfacepublicinterfaceLambdaTest{StringinterMethod(String a);}classMethodClass{publicStringclaMethod1(String a){return a;}publicstaticStringclaMethod2(String a){return a +"hello";}publicStringclaMethod3(String a){System.out.println(a);return a;}}classTestClass{publicstaticvoidmain(String[] args){//LambdaTest test1 = a -> a;//1.对象::实例方法名MethodClass methodClass =newMethodClass();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流对数据进行相应的处理
收集结果就是处理后的结果进行收集

代码举例:

publicclassStreamApi{publicstaticvoidmain(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());}}
标签: java8 lambda stream

本文转载自: https://blog.csdn.net/weixin_46594796/article/details/122765345
版权归原作者 Coder Xu 所有, 如有侵权,请联系我们删除。

“Java8常用特性:Lambda、Stream流、方法引用、函数式接口”的评论:

还没有评论