首页 > 编程语言 >java - 流式编程

java - 流式编程

时间:2024-03-03 15:44:54浏览次数:14  
标签:Map java stream list 编程 List 流式 分组 集合

1.获取流的方法:

// 1.从集合转化
List<Integer> list = new ArrayList<>(); 
Stream<Integer> stream = list.stream();// 转化为流
stream.Collect(Collectors.toList());//转换为流,流再转回为集合。
// 2.自定义初始化
Stream<Integer> stream = Stream.of(1,5,6,4,8,3,1,9);

 

2.流处理算子的使用

2.1 排序

// 1.排序sorted()
    sorted( (x,y)->pattern ):当pattern表达式为正数时,将x放在y后面。
例:
// 当x>y时,pattern为正数,x放在y后面,所以 升序。
list.stream().sorted( (x,y) -> x-y ).Collect(Collectors.toList()); 
// 当x<y时,pattern为正数,x放在y后面,所以 降序。
list.stream().sorted( (x,y) -> y-x ).Collect(Collectors.toList()); 

2.2 过滤去重

    filter( x->pattern ) // 当x使得pattern表达式的值为true时,数据x会保留下来。
例:
// 去重并保留偶数
list.stream().distinct().filter(e -> e % 2 == 0).collect(Collectors.toList());

2.3 groupingBy()分组,并对分组后的数据处理

/**
    算子处理过程的逻辑:对于类型为T的数据流,按照定义的分组逻辑,获取对应的键值对集合Map。Map集合的key类型为分组键值的类型,Map集合的value为数据流原始类型T的集合List<T>。之后经过 value() 方法处理Map,得到Map中的所有value组成的集合List< List<T> >。之后经过map()以及自定义函数getSum,对List< List<T> >内部的List集合进行求和处理,得到 List< int >,并通过foreach输出。
*/
使用示例:
需求:将list数组中的元素按照奇偶分别求和。
// 定义分组逻辑
public static Function<Integer, String> GROUP_KEY = e -> e%2==0? "偶数":"奇数";

// 需求第一种实现:输出结果需要用到分组的键值key
Map<String, List<Integer>> keyedList = list.stream().collect(Collector.groupingBy(GROUP_KEY));

keyedList.foreach( (k,v) -> {
    int sum = v.stream().maptoInt(Integer:intValue).sum();
    System.out.println(k + ": " + sum);
} )

// 需求第二种实现:只需要分组的value,不需要分组的键值key
list.stream().collect(Collector.groupingBy(GROUP_KEY)).value().stream().map(MainClass::geetSum).map(e->e+", ").foreach(System.out:print);
// 第二种实现,需要自定义map处理集合的逻辑
public static int getSum(List<Integer>) {
    // ... 对集合元素的求和逻辑 ...
}

 

2.4 聚合reduce

// 获取数据流的聚合结果
int sum = list.stream().reduce((a,b) -> a+b).get();

 

2.5 匹配

// 全部匹配:流中的每个数据都要符合规则
boolean allMatch = list.stream().allMatch(i -> Pattern);

// 任意匹配:流中 有一个 符合规则的数据即可
boolean anyMatch = list.stream().anyMatch(i -> Pattern);

// 完全不匹配:流中的所有数据都不符合规则
boolean noneMatch = list.stream().noneMatch(i -> Pattern);

 

2.6 结束流(转为 集合、数组、截取前几个元素等)

// 对每个元素调用方法并结束流。
list.stream().foreach( function );

// 转换为 Object列表,Object[]。
list.stream().toArray();

// 截取流的 前5个 元素,并转化为集合输出
list.stream().limit( x ).collect(Collectors.toList());

 

标签:Map,java,stream,list,编程,List,流式,分组,集合
From: https://www.cnblogs.com/zhangzhenw/p/18050133

相关文章

  • 新电脑装编程配置(jdk、MySQL、navicat、idea、Maven、gitee、环境配置)
    一、JDK(java运行环境,不安装不能在自己电脑上运行java语言)1.打开安装包     2.选择安装目录(建议选择非系统盘)      3.安装JRE(最好和JDK分开文件夹、建议选择非系统盘)     4.提示安装成功     配置环境变量:JAVA......
  • Java数组
    Java数组一、什么是数组数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。【数组下标从0开始】二、数组声明创建首先必须声明数组变量,才能在程......
  • Java学习笔记——第四天
    数组数组是什么数组就是一个容器,用来存一批同种类型的数据。数组有什么用遇到批量数据的存储和操作时,数组比变量更适合。代码简洁,逻辑清晰。数组的定义静态初始化数组定义数组的时候直接给数组赋值。格式1(完整格式)数据类型[]数组名=new数据类型[]{元素1,元素2,元素3…......
  • Java中类与类、类与接口、接口与接口之间是什么关系?
    Java中类与类之间是什么关系?1.依赖依赖是指一个类(称为依赖类)使用到了另一个类(称为被依赖类),而这种使用关系是具有偶然性的、临时性的、非常弱的,但是被依赖类(目标类)的变化会影响到依赖类。例如,比如人A要过河,需要借用一条船B,此时人A与船B之间的关系就是依赖。表现在代码层面,为类B......
  • 并发编程之协程理论
    引言本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态。cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务......
  • 并发编程之asyncio模块
    引言Python中的协程:协程是一种轻量级的用户级线程,它在单线程内执行,不会阻塞主线程,可以在多个任务间轻松地切换,因此可以用于实现异步I/O操作。协程的实现方式与生成器非常相似,通过使用yield语句来暂停和恢复执行。协程可以与asyncio库配合使用,来实现异步I/O操作。这种方式可以......
  • 并发编程之Gevent模块
    Gevent的介绍greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回......
  • 并发编程之IO模型
    引言Python的I/O模型分为同步(sync)和异步(async)两种:同步I/O模型是指,当一个线程在等待I/O操作完成时,它不能执行其他任务,需要一直等待I/O操作完成,直到接收到I/O操作的完成通知后才继续执行。异步I/O模型是指,当一个线程发起一个I/O操作后,不会等待I/O操作完成,而是直接执行其他任......
  • 并发编程补充:基于多线程实现并发的套接字通信
    服务端:fromsocketimport*fromthreadingimportThreaddefcommunicate(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......
  • 并发编程补充:基于多进程实现并发的套接字通信
    服务端:frommultiprocessingimportProcessfromsocketimport*deftalk(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......