栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录

1、函数式接口2、Lambda表达式(重点)3、方法引用4、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 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 numList = Arrays.asList(1, 1, 6, 2, 3, 5, 4);
        numList.stream().sorted().forEach(num -> System.out.println(num));

        //4.map映射:把一个流中的元素转化成新的流中的元素,比如这里将list中int元素变成字符串然后输出
        //把 Stream 的流转成一个 Stream 的流
        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 collect = numList.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

        //7.distinct:去重list中数据
        List disList = numList.stream().distinct().collect(Collectors.toList());
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号