# Jdk8Stream **Repository Path**: dd-coding/jdk8-stream ## Basic Information - **Project Name**: Jdk8Stream - **Description**: 针对jdk8中的Stream,了解熟悉其用法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-13 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Jdk8Stream #### 介绍 针对jdk8中的Stream,了解熟悉其用法 #### java.util.stream包常用 1. Stream 2. Collectors #### Stream介绍 Since JDK 1.8,支持顺序和并行聚合的一系列元素。 除了Stream表示对象的引用流之外,还有IntStream/LongStream/DoubleStream,所有这些都称为“流”,并且符合流的特征和限制。 要执行计算的话,Stream可以组成一个Stream Pipeline,一个Stream Pipeline可来源于一个数组、一个集合、一个生成器函数、一个I/O通道、 0个或多个中间操作(将流转换成另一个流)。 流是懒惰的;仅在启动终端操作后才对源数据进行计算,并且仅在需要时才使用源元素。 ##### Collections 和 Streams 集合和流虽然表面上相似,但是它们的目标是不同的。 集合主要与元素的有效管理和访问有关。相比之下,流没有提供直接访问或操纵其元素的方式,而是以声明方式描述其源以及将在该源上聚合执行的计算操作。但是,如果提供的流操作未提供所需的功能,则 iterator() 和 spliterator() 操作可以用于执行受控遍历。 ##### 非线程安全 除非源明确设计用于并发修改(例如 ConcurrentHashMap),否则在查询流时修改流可能会导致不可预测或错误的行为。 ##### 行为参数 行为参数通常是一个功能接口,例如java.util.function.Function,或者是一个lambda表达式,再或者是一个方法引用。除非另有说明,否则这些参数必须是非null的。 ##### 重复使用问题 一个Stream一般只能被操作一次(调用中间或中断流),如果重复使用的话,则会抛出IllegalStateException异常。但是有些流操作可能返回给其接收者而不是一个新对象,很难发现其是否有重复使用。 ##### 关闭问题 Stream中有一个Close方法,但是几乎所有的流实例对象在使用之后都无需关闭。通常,只有是一个IO管道流时,是需要关闭的。 大多数Stream是有由集合,数组或生成函数支持的,这些都不需要特殊的资源管理。 ##### 执行顺序 流管道可以顺序执行,也可以并行执行,执行模式是流的属性。使用初始选择的顺序执行或并行执行来创建流。 (例如,Collection#stream()中的Collection.stream()创建一个顺序流,和Collection#parallelStream()中的Collection.parallelStream()创建一个并行的流。 执行模式可以通过sequential()或parallel()方法进行修改,也可以使用 isParallel() 方法进行查询。 #### 方法介绍 ##### filter 返回一个新的流对象,常见用法: ```` /** * 获取所有成年的人,age >= 18 */ public List getAdultUser(List list) { return list.stream().filter(v -> v.getAge() > 18).collect(Collectors.toList()); } ```` ##### map 常见用法: ```` /** * 按年龄分组,年龄相同的用户名廉洁 * @param list * @return */ public Map getNamesByAge(List list) { Map map = list.stream().collect( Collectors.toMap(User::getAge, User::getName, (String existName, String toAddName) -> existName + "," + toAddName)); return map; } ```` 说明: User::getAge ------> 返回的key User::getName -----> 返回的value,如果value是一个User对象的话,此处可为Function.identify() (String name1, String name2)... ---> 如果key已存在,则将两个名字进行拼接