【触手可及】01-stream的基础使用及基本原理

简介: stream基础向,如果已经很熟了就忽略这篇文章

【触手可及】01-stream的基础使用及基本原理

欢迎关注b站账号/公众号【六边形战士夏宁】,一个要把各项指标拉满的男人。该文章已在 github目录收录。
屏幕前的 大帅比大漂亮如果有帮助到你的话请顺手点个赞、加个收藏这对我真的很重要。别下次一定了,都不关注上哪下次一定。

1.背景介绍

stream基础向,如果已经很熟了就忽略这篇文章,可以看stream进阶使用

2.基础概念及基础原理介绍

操作分类

    中间操作(有状态的需要临时迭代再进行下一步,无状态不需要)
        无状态(整体链表结构保证其只循环一次):unordered()、filter()、 map()、 mapToInt() 、mapToLong() 、mapToDouble()、 flatMap() 、flatMapToInt()、 flatMapToLong()、 flatMapToDouble()、 peek()
        有状态:distinct()、 sorted() 、sorted()、 limit()、 skip()
    结束操作
        非短路操作(循环全部):forEach() 、forEachOrdered() 、toArray()、 reduce()、 collect()、 max() 、min() 、count()
        短路操作(匹配到直接结束流):anyMatch() 、allMatch() 、noneMatch()、findFirst()、findAny()

3.拉姆达表达式和匿名内部类

以相对熟悉的runnable接口为例

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println(1);
    }
});

可以简写成如下一行代码,其关键在于Runnable下只有一个方法,所以jvm可以推断出找的就是run方法

Thread thread = new Thread(() -> System.out.println(1));

4.::写法和拉姆达表达式

使用方法 对应lambda表达式
object::instanceMethod (a,b,.....)->特定对象.实例方法(a,b....)
Class::staticMethod (a,b,.....)->类名.类方法(a,b....)
Class::instanceMethod (a,b,.....)->a.实例方法(b....)
Class::new (a,b,.....)->new 类名(a,b....)

4.1::情景1

StreamExample streamExample = new StreamExample();
Stream.of("1", "2", "3", "4").forEach(s -> streamExample.test(s));

等同于如下方法

StreamExample streamExample = new StreamExample();
Stream.of("1", "2", "3", "4").forEach(streamExample::test);

4.2::情景2

Stream.of(1, 2, 3, 4).forEach(s -> StreamExample.staticTest(s));

等同于如下方法

Stream.of(1, 2, 3, 4).forEach(StreamExample::staticTest);

4.3::情景3

Stream.of(new StreamExample(), new StreamExample()).forEach(s -> s.test());

等同于

Stream.of(new StreamExample(), new StreamExample()).forEach(StreamExample::test);

4.4::情景4

Stream.of("1", "2", "3", "4").forEach(s -> new String(s));

等同于

Stream.of("1", "2", "3", "4").forEach(String::new);

5.stream的基础写法

static void mainExample() {
    List<StreamTestExample> collectStreamTestExample = IntStream.range(0, 6).mapToObj(s -> new StreamTestExample(s, String.valueOf(s))).collect(Collectors.toList());
    System.out.println("filter");
    System.out.println(Stream.of(1, 2, 3, 4, 5).filter(s -> s > 3).count());
    System.out.println(collectStreamTestExample.stream().filter(s -> s.getAge() > 3).collect(Collectors.toList()));
    System.out.println("distinct");
    System.out.println(Stream.of(1, 1, 2).distinct().collect(Collectors.toList()));
    System.out.println("sorted");
    System.out.println(Stream.of(1, 2, 12, 7, 9).sorted().collect(Collectors.toList()));
    System.out.println(Stream.of(1, 2, 12, 7, 9).sorted((a, b) -> b - a).collect(Collectors.toList()));
    System.out.println("skip&limit");
    List<Integer> list = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());
    int pageNum = 2;
    int pageSize = 3;
    System.out.println(list.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList()));

    // anyMatch 判断集合中的元素是否至少有一个满足某个条件
    System.out.println("anyMatch");
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).anyMatch(s -> s > 3));
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).anyMatch(s -> s > 10));

    // allMatch 判断集合中的元素是否都满足某个条件
    System.out.println("allMatch");
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).allMatch(s -> s > 3));
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).allMatch(s -> s > 0));

    // noneMatch 判断集合中的元素是否都不满足某个条件
    System.out.println("noneMatch");
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).noneMatch(s -> s > 3));
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).noneMatch(s -> s < 0));

    // findAny 快速获取一个通常第一个
    System.out.println("findAny");
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).findAny().get());

    System.out.println("findFirst");
    System.out.println(Stream.of(1, 2, 1, 3, 2, 5).findFirst().get());

    //对numbers中的元素求和 16
    System.out.println(Arrays.asList(1, 2, 1, 3, 3, 2, 4)
            .stream()
            .reduce(0, Integer::sum));
    //求集合中的最大值
    Arrays.asList(1,2,1,3,2,5)
            .stream()
            .reduce(Integer::max)
            .ifPresent(System.out::println);
}
filter
2
[StreamExample.StreamTestExample(super=com.example.demo.lesson.greenhand.StreamExample$StreamTestExample@eb9, age=4, name=4), StreamExample.StreamTestExample(super=com.example.demo.lesson.greenhand.StreamExample$StreamTestExample@ef5, age=5, name=5)]
distinct
[1, 2]
sorted
[1, 2, 7, 9, 12]
[12, 9, 7, 2, 1]
skip&limit
[4, 5]
anyMatch
true
false
allMatch
false
true
noneMatch
false
true
findAny
1
findFirst
1
16
5
相关文章
|
机器学习/深度学习 算法 数据挖掘
机器学习的基本概念与核心功能
机器学习的基本概念与核心功能
|
2天前
|
监控 安全 持续交付
深入探讨 Webhook 的本质、工作原理以及其在不同领域的应用,帮助你更好地理解和运用这一技术
Webhook是一种在特定事件发生时,由服务器主动向客户端发送通知的机制,实现数据的实时、高效传递。本文介绍Webhook的基本概念、工作原理、应用场景及设置使用方法,探讨其优势与挑战,帮助读者更好地理解和应用这一技术。
16 7
|
2月前
|
API 数据处理 数据库
掌握 Kotlin Flow 的艺术:让无限数据流处理变得优雅且高效 —— 实战教程揭秘如何在数据洪流中保持代码的健壮与灵活
Kotlin Flow 是一个强大的协程 API,专为处理异步数据流设计。它适合处理网络请求数据、监听数据库变化等场景。本文通过示例代码展示如何使用 Kotlin Flow 管理无限流,如实时数据流。首先定义了一个生成无限整数的流 `infiniteNumbers()`,然后结合多种操作符(如 `buffer`、`onEach`、`scan`、`filter`、`takeWhile` 和 `collectLatest`),实现对无限流的优雅处理,例如计算随机数的平均值并在超过阈值时停止接收新数据。这展示了 Flow 在资源管理和逻辑清晰性方面的优势。
61 0
|
3月前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
76 2
|
3月前
|
存储 消息中间件 监控
构建高效的数据流处理系统:从理论到实践
【8月更文挑战第27天】本文旨在通过深入浅出的方式,带领读者探索构建一个高效、可扩展的数据流处理系统的全过程。我们将从基本概念出发,逐步深入到架构设计、技术选型、实现细节,并最终展示如何将理论应用于实际项目中。文章不仅提供代码示例,还着重讨论了在设计和开发过程中遇到的挑战及解决策略,为希望深入了解或构建数据流处理系统的技术人员提供了一份实用指南。
|
4月前
|
机器学习/深度学习 自然语言处理 搜索推荐
|
5月前
|
存储 Cloud Native NoSQL
深度解析数据库技术:核心原理、应用实践及未来展望
一、引言 在信息化高速发展的今天,数据库技术作为数据管理的基石,承载着企业运营、决策支持、大数据分析等核心功能
|
5月前
|
机器学习/深度学习 人工智能 网络安全
人工智能平台PAI产品使用合集之在本地可以成功进入模型流,但在服务器上无法进入,是什么原因
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
6月前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
71 3
|
6月前
|
存储 编解码 网络协议
音视频编程ffmepg中的关键术语与概念:深度解析与实践(一)
音视频编程ffmepg中的关键术语与概念:深度解析与实践
130 0