一句话搞懂Java8 stream!!!

简介: 在review代码的过程中,经常看到一些代码能够使用stream的方式处理的更好,会建议同事使用stream。

在review代码的过程中,经常看到一些代码能够使用stream的方式处理的更好,会建议同事使用stream。


stream 作为 Java 8 提供的 特性,过去这么多年了,但是在开发中有些程序小哥哥依然不愿意使用,觉得代码不够直白,宁愿多写一些for循环,但是历史证明新欢总比旧爱好,留下的都是优质的。不去接触,学习下新鲜事物,必将成为一个老古董 。只要你想下车撒泡尿,你就会被历史的车轮无情甩下,因为这是一趟高铁。你看新欢正在向你招手。


99123b58dce54a97850fcdff01f8eb6b~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

1、为什么不愿意使用流


我认为有几方面的原因:


一是现在的for while 能解决问题,没必要


二是没有发现stream的好,不愿意使用。


三是自己没有抓住理解的核心,记忆起来很费劲,用起来不顺手。


2、理解流


流 如字面意思,顺序处理,最终产出结果。


我的理解,流和sql 有差不多的行为方式。对数据进行筛选,整合。


 

微信截图_20220606192127.png


作为Java程序员一般都会知道如何写Sql,一个简单的sql 像下面这样:


select * from table where 限制条件 group by 条件 limit 10 
从数据源中过滤出数据,进行分组,然后取一部分。
复制代码


sql能做的事,流基本都能做。


3、举个例子


3687760d45054f9e89c42dc484d17d31~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

 

定义Player类的定义如下:


/**
 * 玩家类 
 * 公众号:香菜聊游戏
 */
@AllArgsConstructor
public class Player {
    //  名字
    @Getter @Setter
    public String name;
    //  性别
    @Getter @Setter
    private int sex;
    //  年龄
    @Getter @Setter
    private int age;
    //  工资
    @Getter @Setter
    private int salary;
}
复制代码


1、过滤数据 ==>where


//  过滤出年龄在18岁以上的所有人的名字
        List<Player> age18List = playerList.stream()
        .filter(player -> player.getAge() > 18)
        .collect(Collectors.toList());
复制代码


2、过滤字段 ==>也就是select 的列


List<String> age18NameList = playerList.stream()
                .filter(player -> player.getAge() > 18)
                .map(Player::getName)
                .collect(Collectors.toList());
复制代码


3、分组,按性别分组 ==> group by


Map<Integer, List<Player>> age18GroupMap = playerList.stream()
                .filter(Player -> Player.getAge() > 18)
                .collect(Collectors.groupingBy(Player::getSex));
复制代码


4、排序后取前两位 ==> limit


//  过滤出年龄在18岁以上并且最小的2个
        List<Player> age18List = playerList.stream()
                .sorted(Comparator.comparingInt(Player::getAge))
                .limit(2)
                .collect(Collectors.toList());
复制代码


5、求和 ==> sum


Integer age18SumSalary = playerList.stream()
                .map(Player::getSalary)
                .reduce(0,Integer::sum);
复制代码


以上几个例子只是stream的一些举例,介绍了和sql 的相似性。只要你想到的都可以实现。sql不好实现的stream也可以实现。在学习的时候先了解,在使用的时候不清楚可以搜索一下,多用几次就熟练了,就掌握了。stream没有增加什么新的东西,只是新瓶装旧酒,不同的语法形式而已。


选择「爱我」还是「恨我」,这矛盾永远存在... 恨我,因为我华美的表演,我自信到狂妄 恨我,因为我精准的后仰跳投,我对胜利的热切渴望 恨我,因为我是个无所不能的老手,一个胜者 憎恨我吧,请用你身体中的每一个细胞来狠狠的憎恨我,憎恨我被同样执著的一群人所深爱着


居然和你的丝毫不差…


4、总结


stream让我们的代码更简洁,逻辑上更加顺畅,写更少的代码,做更多的事。stream 解开了代码细节和业务逻辑的耦合,表达的是"要做什么"而不是"如何去做",可以更加专注于业务逻辑,写出易于理解和维护的代码。用sql的知识做类比,去完成对stream的认识,学习,知识迁移是我们学习的捷径,你掌握了吗?

目录
相关文章
|
5月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
154 0
|
1月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
80 6
|
1月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
1月前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
2月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
35 0
|
3月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
58 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
3月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
35 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
2月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
4月前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
227 11
|
4月前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
168 9
Java 8 Stream Api 中的 peek 操作