Java8新特性Stream用法

【Java8 新特性 5】Java 8 stream的详细用法 一、Java8 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda,给我们操作集合(Collection)提供了极大的便利。 Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。 1、使用流的好处 代码以声明性方式书写,说明想要完成什么,而. 阅读详情

Stream API 介绍

Java8中有两个最为重要的改变。第一个是Lambda表达式;另一个就是Stream API 。它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream(流)是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

 

需要注意的是:

  • Stream 不会存储元素
  • Stream 不会改变数据源对象。而是返回一个持有结果的新的Stream
  • Stream 操作是延迟执行的。

操作Stream的三个步骤 

  1. 创建Stream:获取数据源的流
  2. 中间操作:一系列针对数据源数据的操作(操作连)
  3. 终止操作:执行中间的所有操作,并产生结果

 

 与Collection操作不同, Stream操作还有两个基础的特征:

    Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 
    如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
    
    内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式,
    显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 
    通过访问者模式(Visitor)实现。

记录代码:

 //创建一个数据源  多个stds 对象组成的json数组
        String strs="[ { \"stdid\": \"1\", \"score\": \"20\", \"ts\": \"2019-11-15 13:30:10\" }, { \"stdid\": \"2\", \"score\": \"22\", \"ts\": \"2019-11-15 13:31:08\" }, { \"stdid\": \"3\", \"score\": \"20.2\", \"ts\": \"2019-11-14 13:31:20\" }, { \"stdid\": \"4\", \"score\": \"25\", \"ts\": \"2019-11-15 13:33:27\" }, { \"stdid\": \"5\", \"score\": \"20\", \"ts\": \"2019-11-13 13:33:36\" }, { \"stdid\": \"6\", \"score\": \"21.2\", \"ts\": \"2019-11-15 13:33:47\" }, { \"stdid\": \"7\", \"score\": \"26\", \"ts\": \"2019-11-15 13:37:05\" }, { \"stdid\": \"8\", \"score\": \"29\", \"ts\": \"2019-11-15 13:37:31\" }, { \"stdid\": \"9\", \"score\": \"30\", \"ts\": \"2019-11-19 13:37:38\" }, { \"stdid\": \"10\", \"score\": \"12\", \"ts\": \"2019-11-15 13:37:58\" }, { \"stdid\": \"11\", \"score\": \"15\", \"ts\": \"2019-11-22 13:38:04\" }, { \"stdid\": \"12\", \"score\": \"15\", \"ts\": \"2019-11-11 13:38:04\" } ]";

        // 通过GSON 解析成List,也可以通过fastjson进行解析成数组
        Gson gson=new Gson();
        JsonParser parser = new JsonParser();
        final JsonElement parse = parser.parse(strs);  
        final JsonArray asJsonArray = parse.getAsJsonArray(); //解析成json数组
        List<Stds> stds=new ArrayList<>();
        asJsonArray.forEach(jsonElement -> {
            stds.add(gson.fromJson(jsonElement, Stds.class));
        });
        //数据源整理好之后,下面就是正式的流处理实战了
        //  (小试牛刀一波)需求: 取 在时间2019-11-15 13:37:31之前的连续5条数据(按时间排序)的分数前三的平均数
        
        //1.先根据时间排序降序(),
        final double average = stds.stream().
                sorted(Comparator.comparing(Stds::getTs).
                        reversed()).
                filter(stds2 -> stds2.getTs().getTime() < Timestamp.valueOf("2019-11-15 13:37:31").getTime()).
                limit(5).
                sorted(Comparator.comparing(Stds::getScore).reversed()).
                limit(3).
                mapToDouble(e -> e.getScore()).summaryStatistics().getAverage();
             System.out.println(average);

            // collector  处理完流得到的是Stream对象,一般我们会转为集合
        final List<Stds> collect = stds.stream().collect(Collectors.toList());
        System.out.println(collect.toString());

实体类:

public class Stds {
    private Integer stdid;

    private Double score;

    private Timestamp ts;
}

 

 

 

浅谈车联网概述-1 车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。 阅读详情

相关推荐

PCB 传输线教程(上):基于 Polar Si9000 与嘉立创工艺的传输线设计

理论线宽是W1,但在实际制作时,铜线顶部会有部分被刻蚀掉,表面被刻蚀后的宽度表示为W2,一般取经验值W2=W1-1,单位为 mil,Si9000 里面默认也是采用 W1,W2 相差 1 mil 的方式进行计算。表面阻抗结构就是简单的在一个平面上走信号线,以另外一个平面为地平面,信号线所在平面不进行铺铜(或铺铜间距大到可以忽略不计),这是最简单的一种结构,只需要知道介质层的厚度和介电常数、信号线厚度就可以进行阻抗计算。这个也是经验值,一般保持默认,或者可以填入 C1 相同的值(即忽略堆积)。

Surrea1的博客 1万+

java8 filter 取反_Java8新特性-用法详解(一)Stream

JAVA8新特性-用法详解JAVA8新特性-用法详解Predicate接口Predicate 接口只能接收一个参数,且返回 boolean 类型。类似于 Assert 的自定义断言例子:Predicate predicate = new Predicate() {@Overridepublic boolean test(String s) {return s.equals("张三");}};Pre...

weixin_35000379的博客 1885

最新版Node.js下载安装及环境配置教程(非常详细)

选择对应你系统的Node.js版本。

DN金猿的博客 12万+

Java8新特性, 函数式编程及Stream流用法大全

Java8函数式编程介绍,Stream流用法大全

咖啡煮码 1136

CAN总线错误帧全解析:从数据包到硬件层的故障树分析

本文深入解析CAN总线错误帧的故障树分析方法,从数据包到硬件层全面剖析错误机制。通过物理层信号测试、数据链路层错误解码和应用层协议排查,提供系统化的诊断框架。结合CANoe配置和示波器波形分析,帮助工程师快速定位总线故障,提升系统可靠性。

weixin_26742753的博客 487

OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation

电磁线圈组驱动经典系统,可以作为参考。 OctoMag: 用于5自由度无线微操作的一个电磁铁系统 OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation [1] Paper Link Authors: J. J. Abbott, etc. 2010, TRO IEEE Transactions on Robot...

XU Yangxin的博客 1665

JAVA8新特性stream的几点用法

JAVA 8新特性stream流         Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。         Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对...

weixin_41524626的博客 384

ABAP Channels 实战:在 ABAP 7.40 中用 WebSocket 打造实时双向通信

本文详细介绍了SAP ABAP 7.40引入的ABAP Channels通信框架,包含AMC(ABAP Messaging Channels)和APC(ABAP Push Channels)两部分。AMC作为应用服务器内部的消息总线,支持发布/订阅模式,可实现跨会话实时通信;APC基于WebSocket协议,用于浏览器等客户端与ABAP服务器的双向实时交互。文章通过一个乒乓球游戏案例展示了ABAP Channels的实时协作能力,并详细解析了AMC的配置方法、消息发送与接收的代码实现,帮助开发者理解如何利用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 220

stream filter 用法_Java8新特性之Stream

作者:freshchen转载自:https://www.cnblogs.com/freshchen/p/12313999.html大家回忆下日常学习工作中使用的最多的 Java API 是什么?相信很多人的答案和我一样都是集合。我们选择适合的集合数据结构存储数据,而我们之于集合最多的操作就是遍历,实现查询,统计,过滤,合并等业务。哪里用Stream集合迭代外部迭代:通过 for循环,It...

weixin_39641236的博客 1660

《手把手教你玩转RTOS操作系统》专栏简介

《手把手教你玩转RTOS操作系统》专栏系统讲解实时操作系统开发,以FreeRTOS为主线,结合RT-Thread和Zephyr对比分析。内容涵盖RTOS基础、任务管理、通信机制、中断处理等核心知识,并配套STM32/ESP32平台实战项目。专栏特色在于零基础友好、实战驱动、多系统对比和行业趋势分析,适合嵌入式开发者进阶RTOS开发能力,解决实际项目中的选型与优化问题。通过完整学习路径,读者可掌握构建高可靠性嵌入式系统的关键技能。

MHD0815的博客 530

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 341

Java8新特性Stream的常见用法

目录 Stream简介 Stream的使用 创建流 Stream简介 Stream流是java 8 中新引入的特性,用来处理集合中的数据,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。 Stream不是数据结构,也不保存数据,它是有关算法和计算的,更像一个高级版本的迭代器Iterator。原始版本的 Iterator,只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,只要给出需要对其包含的元素执行什么操作,比如

Java升级之路的博客 1184

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1822

【新特性】Java8新特性stream的用法

java8关于stream的部分用法 list集合分组后按时间排序取最近的一条记录 集合按照id进行分组后,按照时间顺序取最近一条记录 List<Documnet> list = new ArrayList(); Map<String, Document> map = list.parallelStream().collect(Collectors.groupingBy(data -> data.getString("id"), Collectors.colle

Jude的博客 2237

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java8新特性Stream用法实例

package com.lcz.stream; import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Random; import java.util.stream.Collectors; public class StreamMain { ...

(完整资料) 768

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java8 新特性之stream用法

//1. 得到集合中对象的某个属性的集合 list.stream().map(CheckRecord::getId).collect(Collectors.toList()); //2. 根据groupId分组, 得到map(key: groupId, value: 对应的list集合) Map<String, List<Stutent>> collectbyGroup...

qq_34091758的博客 8092

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java8新特性Stream用法

什么是Stream 就是Java 8 API的一个新的抽象Stream,它可以让你用全新的方式处理数据; 优点: 极大的提高程序员的代码的效率 使用语法 stream() //− 为集合创建串行流。 parallelStream() //− 为集合创建并行流。 List<Integer> transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) //

m0_52283848的博客 346

Java8新特性stream()一些常见用法

Java8新特性stream()一些常见用法 对象数组转字段数组 把一个对象集合转成对象中某个字段的集合: List<Coupon> couponList = 查询出来的集合 List<Long> couponIds = couponList.stream().map(Coupon::getCouponId).collect(Collectors.toList()); 获取集合中的couponId的集合; Coupon为对象,cou

zp0926的博客 960

Java8新特性之stream的详细用法

一、概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 特点: 不是数据结构,不会保存数据。 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可以修改流中元素) 惰

cristianoxm的博客 586

Java 8新特性stream API用法总结

前言   Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进...

dengyinyi1166的博客 258

java的collect用法_java8新特性:stream流中collect用法

java8新特性:stream流中collect用法java8新特性:stream流中collect用法1.toListList collectList = Stream.of(1, 2, 3, 4).collect(Collectors.toList());System.out.println("collectList: " + collectList);// 打印结果// collectLis...

weixin_28750369的博客 2251

【Java 8 新特性】Java Stream.of()用法示例

本页将介绍Java Stream.of方法示例。Stream.of用于为给定元素创建顺序流。我们可以传递单个元素或多个元素。 查看javadoc中Stream.of方法声明。 static <T> Stream<T> of(T t) 参数:传递单个元素。 返回:该方法返回一个包含一个元素的流。 static <T> Stream<T> of(T... values) 参数:传递多个元素。 返回:该方法返回包含给定元素的流。 Stream.of创建有限元

猫巳的博客 3万+

关于java8新特性 Stream流的常规用法总结

关于java8新特性中,集合的stream流的常规用法简介,以及案例演示等

MyfishCake的博客 1683

java8新特性stream用法

不说废话, 直接见代码: @Test // 2019-08-20 author: 杨汉奇 public void test() { List<User> userList = new ArrayList<>(); userList.add(new User(1,new BigDecimal("1000"))); userList.add(new...

weixin_42533856的博客 199

java8新特性:stream流中collect用法

1.toList List<Integer> collectList = Stream.of(1, 2, 3, 4) .collect(Collectors.toList()); System.out.println("collectList: " + collectList); // 打印结果 // collectList: [1, 2, 3, 4] 2.toSet Set<Integer> collectSet = Stream.of(2, 3, 3, 3)

AI出海日记 6533

Java 8 新特性:集合 Stream 流及其用法

Stream 是一种对集合对象进行操作的抽象方式,允许我们以声明性的方法处理数据。与传统的集合不同,Stream 不会存储数据,它只是对数据源(如集合、数组)进行计算的视图。Stream 可以是顺序的,也可以是并行的,这使得它在处理大量数据时非常高效。Java 8 的 Stream 流特性为集合操作提供了更加灵活和强大的方式。通过函数式编程的风格,可以以更加简洁、可读的方式来处理数据。掌握 Stream 的使用,可以大大提高你的 Java 编程效率。

m0_54187478的博客 825
上一篇: SpringBoot集成mybatis案例
下一篇: springboot集成validation校验包案例
splendor.s
博客等级 码龄10年 91粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值