我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java详细分析Lambda表达式与Stream流的使用方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java详细分析Lambda表达式与Stream流的使用方法

Lambda

       Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解为一段可以传递的代码(将代码段像数据一样传递)。使用它可以写出更简洁, 更灵活的代码。作为一种更紧凑的代码风格,使 java 语言的表达式能力得到的提升。

我们可以知道, Lambda表达式是为简化语法而存在的

ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
});
System.out.println(list);

       这里有一个List集合 , 并添加了一些元素, 我们想对他进行排序, 并且按照降序的方式来排 , 在没接触Lambda表达式之前 ,我们是向上面那样去做的

       上面这种方式是匿名内部类写法 , 调用sort()方法时, 要求传入一个比较器, Comparator是一个接口, 接口可以new吗? 肯定是不能的 , 所以这里是有一个隐藏的类去实现了Comparator接口, 并且重写了它里面的compare()方法 , 来制定我们的比较规则, 这个隐藏的类没有类名, 就是我们这里所说的匿名内部类 , 但方法也是不能作为参数去传递的, 所以我们new了这个匿名内部类的对象 , 包裹了实现后的方法

但是现在我们嫌这个写法太啰嗦了 ,我们使用Lambda来看看

// Lambda表达式
list.sort((o1,o2) -> {return o2.compareTo(o1);});

这就和上面的匿名内部类写法是一样的

Lambda表达式的结构 : 

左侧:lambda 表达式的参数列表

右侧:lambda 表达式中需要执行的功能,即 lambda 体

(arg1, arg2...) -> { body }

(type1 arg1, type2 arg2...) -> { body }

常见例子

无参数,无返回值,lambda 体中只有一行代码时,{}可以忽略 () -> System.out.println("Hello World");

无参数,有返回值  () -> { return 3.1415 };

有参数,无返回值  (String s) -> { System.out.println(s); }

有一个参数,无返回值 s -> { System.out.println(s); }

有多个参数,有返回值 (int a, int b) -> { return a + b; }

有多个参数,表达式参数类型可以不写,jvm 可以根据上下文进行类型推断 (a, b) -> { return a - b; }

功能接口

        功能接口上面一般会有这样一个注解标签@FunctionalInterface , 它表示此接口只有一个抽象方法, 当你注释的接口违反了 Functional Interface 的契约时,它可以用于编译器级错误

        例如 : 我们刚使用的comparator接口就有这样的注解

Stream流 

      允许你以声明式的方式处理数据集合,可以把 它看作是遍历数据集的高级迭代器。此外与 stream 与 lambada 表达示结合后 编码效率与大大提高,并且可读性更强。

      流更偏向于数据处理和计算,比如 filter、map、find、sort 等。简单来说,我们通过一个集合的 stream 方法获取一个流,然后对流进行一 系列流操作,最后再构建成我们需要的数据集合。

  

     我们常常将Stream流与Lambda表达式结合来编码 , 那么如何来使用呢 ?

这里分为 3 步 : 

1. 获得流

2. 中间操作

3. 终端操作

中间操作(往往对数据进行筛选)

  • filter:过滤流中的某些元素,
  • sorted(): 自然排序,流中元素需实现 Comparable 接口
  • distinct: 去除重复元素
  • limit(n): 获取 n 个元素
  • skip(n): 跳过 n 元素,配合 limit(n)可实现分页
  • map(): 将其映射成一个新的元素

终端操作(往往对结果集进行处理)

  • forEach: 遍历流中的元素
  • toArray:将流中的元素倒入一个数组
  • Min:返回流中元素最小值   Max:返回流中元素最大值
  • count:返回流中元素的总个数
  • Reduce:所有元素求和
  • anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返回 true,否则返回
  • falseallMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返回 true,否则返回 false
  • findFirst:返回流中第一个元素
  • collect:将流中的元素倒入一个集合,Collection 或 Map
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Arrays.stream(arr)    //拿到流
    .filter((a) -> {return a>3;})  //中间操作,过滤
    .forEach((a) -> {   //终端操作,遍历
        System.out.println(a);
    });
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Object[] objects = Arrays.stream(arr)
    .sorted().distinct() //排序并去重
    .toArray();  //转数组
System.out.println(Arrays.toString(objects));
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Integer max = Arrays.stream(arr).distinct()
    .max(((o1, o2) -> {    //去重返回最大值
        return o1 - o2;
    })).get();  //拿到这个值
//此处max为终端操作,返回的已经不是流,而是一个OPtion的对象
//它里面有一个get()方法可以返回这个值
System.out.println(max);
Integer[] arr = new Integer[]{1,4,3,2,5,5};
long count = Arrays.stream(arr).distinct()
    .count();   //返回总个数
System.out.println(count);
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Integer i = Arrays.stream(arr).distinct()
    .reduce((o1, o2) -> {  //所有元素求和
        return o1 + o2;
    })
    .get();
System.out.println(i);

这里需要注意的是中间操作的map()方法和终端操作的collect()方法

设计一个Apple类

public class Apple {
    private Integer num;
    private String name;
    private String color;
}

并给出 构造 , set 和 get 方法 ,此处由于篇幅 原因省略

List<Apple> list = new ArrayList<>();
list.add(new Apple(100,"苹果1","红色"));
list.add(new Apple(105,"苹果5","红色"));
list.add(new Apple(104,"苹果4","红色"));
list.add(new Apple(103,"苹果3","红色"));
list.add(new Apple(102,"苹果2","红色"));

往一个list添加5个元素 

List<String> collect = list.stream()
    //将属性的一列通过get方法映射成流
    .map(Apple::getName)
    //转为一个list集合
    .collect(Collectors.toList());
System.out.println(collect);
List<Apple> collect = list.stream().sorted(((o1, o2) -> {
    //通过num属性自定义排序
    return o1.getNum() - o2.getNum();
    }))
    //转为一个list集合
    .collect(Collectors.toList());
System.out.println(collect);
Map<Integer, String> map = list.stream().sorted(((o1, o2) -> {
    return o1.getNum() - o2.getNum();
    }))
    //转map, 第一个参数为键,第二个参数为值
    .collect(Collectors.toMap(Apple::getNum, Apple::getName));
System.out.println(map);

到此关于Lambda表达式与Stream流就介绍完了,感谢阅读

到此这篇关于Java详细分析Lambda表达式与Stream流的使用方法的文章就介绍到这了,更多相关Java Lambda与Stream内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java详细分析Lambda表达式与Stream流的使用方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java的Lambda表达式使用实例分析

这篇文章主要讲解了“Java的Lambda表达式使用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Lambda表达式使用实例分析”吧!Lambada 简介lambda 表达
2023-07-05

Python中lambda表达式的简要介绍和详细使用方法

Python中lambda函数的简介与用法详解在Python中,lambda函数是一种特殊的匿名函数,它可以在需要函数对象的任何地方使用。lambda函数通常用来定义一些简单的函数,它们可以只有一个表达式,并且返回结果。本文将向您介绍la
Python中lambda表达式的简要介绍和详细使用方法
2024-02-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录