`
一帆风顺
  • 浏览: 3516 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Stream(二)

 
阅读更多
import java.time.LocalDate;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.junit.Test;
import pojo.Employee;

public class StreamTerminalTest {
	Employee[] e = { new Employee("张三", 500.0, 25, LocalDate.of(1995, 03, 07)),
		new Employee("李四", 400.0, 20, LocalDate.of(1999, 01, 13)),
		new Employee("王五", 700.0, 23, LocalDate.of(1997, 11, 27)),
		new Employee("赵六", 900.0, 26, LocalDate.of(1994, 07, 06)),
		new Employee("阿七", 400.0, 22, LocalDate.of(1998, 10, 19)),
		new Employee("阿七", 400.0, 22, LocalDate.of(1998, 10, 19))
	};

	// 终端操作(不返回Stream类的对象)
	
	// long count() 获取流的长度
	@Test
	public void countTest() {
		List<Employee> list = Arrays.asList(e);
		long count = list.stream().count();
		System.out.println(count);
	}
	输出:
	6


	/*
	 * Optional<T> max(Comparator<? super T> comparator)
	 * 根据Comparator指定条件获取流中最大的元素的Optional,所谓的最大值就是重新进行排序的, max就是取重新排序后的最后一个元素的Optional
	 */
	@Test
	public void MaxTest() {
		List<Employee> list = Arrays.asList(e);
		//年龄最大的
		Optional<Employee> max = list.stream().max((x, y) -> x.getAge().compareTo(y.getAge()));
		System.out.println(max.get());
	}
	输出:
	Employee [name=赵六, salary=900.0, age=26, hireDay=1994-07-06]


	/*
	 * Optional<T> min(Comparator<? super T> comparator)
	 * 根据Compator指定条件获取流中最小的元素的Optional,所谓的最小值就是重新进行排序的, min就是取重新排序后的第一个元素的Optional
	 */
	@Test
	public void MinTest() {
		List<Employee> list = Arrays.asList(e);
		Optional<Employee> min = list.stream().min((x, y) -> x.getAge().compareTo(y.getAge()));
		System.out.println(min.get());
	}
	输出:
	Employee [name=李四, salary=400.0, age=20, hireDay=1999-01-13]	


	/*
	 * boolean allMatch(Predicate<? super T> predicate)
	 * 判断流中的元素是否都满足指定的条件,全部满足返回true,否则返回false
	 */
	@Test
	public void allMatchTest() {
		List<Employee> list = Arrays.asList(e);
		boolean allMatch = list.stream().allMatch((e) -> e.getAge() == 20);
		System.out.println(allMatch);
	}
	输出:
	false	


	/*
	 * boolean anyMatch(Predicate<? super T> predicate)
	 * 判断流中的元素是否都满足指定的条件,至少有一条满足返回true,否则返回false boolean 
	 */
	@Test
	public void anyMatchTest() {
		List<Employee> list = Arrays.asList(e);
		boolean allMatch = list.stream().anyMatch((e) -> e.getAge() == 20);
		System.out.println(allMatch);
	}
	输出:
	true


	/*
	  *  noneMatch(Predicate<? super T> predicate) 
	  *  判断流中的元素是否都满足指定的条件,如果所有元素都不满足条件,返回true;否则返回false.
	 */
	@Test
	public void noneMatchTest() {
		List<Employee> list = Arrays.asList(e);
		boolean allMatch = list.stream().noneMatch((e) -> e.getAge() < 20);
		System.out.println(allMatch);
	}
	输出:
	true


	// Optional<T> findFirst() 返回流中的第一个元素的Optional,如果流为空,则返回一个空的Optional。
	@Test
	public void findFirstTest() {
		List<Employee> list = Arrays.asList(e);
		Optional<Employee> first = list.stream().findFirst();
		System.out.println(first);
	}
	输出:
	Optional[Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]]


	/*
	 * Optional<T> findAny() 返回流中的某个元素的Optional,如果流为空,则返回一个空的Optional。
	 * 串行流中返回第一个元素,并行流中会自由的选择流中的任意一个元素。
	 */
	@Test
	public void findAnyTest() {
		List<Employee> list = Arrays.asList(e);
		Optional<Employee> first = list.stream().findAny();
		System.out.println(first);
	}
	输出:
	Optional[Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]]


	// forEach(Consumer<? super T> action) 遍历流中的所有元素
	@Test
	public void forEachTest() {
		List<Employee> list = Arrays.asList(e);
		Stream stream = list.stream();
		stream.forEach(System.out::println);
	}
	输出:
	Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]
	Employee [name=李四, salary=400.0, age=20, hireDay=1999-01-13]
	Employee [name=王五, salary=700.0, age=23, hireDay=1997-11-27]
	Employee [name=赵六, salary=900.0, age=26, hireDay=1994-07-06]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]


	/*
	 * forEachOrdered(Consumer<? super T> action) 遍历流中的所有元素
	 * 不同与forEach()的是,在使用并行流时,仍然按照初始流时元素的顺序遍历。
	 */
	@Test
	public void forEachOrderedTest() {
		List<Employee> list = Arrays.asList(e);
		list.stream().forEachOrdered(System.out::println);
	}
	输出:
	Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]
	Employee [name=李四, salary=400.0, age=20, hireDay=1999-01-13]
	Employee [name=王五, salary=700.0, age=23, hireDay=1997-11-27]
	Employee [name=赵六, salary=900.0, age=26, hireDay=1994-07-06]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	

	 /* 
	 * Optional<T> reduce(BinaryOperator<T> accumulator)
	 * <U> U reduce(T identity,BinaryOperator<T> accumulator) 
	 * <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner); 
	 *     将流中的元素反复结合起来,获得一个值
	*/
	@Test
	public void reduceTest1() {
		List<Employee> list = Arrays.asList(e);
                //最大薪资
		Optional<Employee> reduce = list.stream().reduce((x, y) -> {
			System.out.println("x:" + x.getName() + "y:" + y.getName());
			return x.getSalary().compareTo(y.getSalary()) > 0 ? x : y;
		});
		System.out.println(reduce.get());
	}
	输出:
	x:张三y:李四
	x:张三y:王五
	x:王五y:赵六
	x:赵六y:阿七
	x:赵六y:阿七
	Employee [name=赵六, salary=900.0, age=26, hireDay=1994-07-06]


	@Test
	public void reduceTest2() {
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
		// 将0传进x与y(流中的每个元素)进行指定的操作(求总和)
		Integer reduce = list.stream().reduce(0, (x, y) -> {
			System.out.println("x:" + x + "y:" + y);
			return x + y;
		});
		System.out.println(reduce);
	}
	输出:
	x:1y:2
	x:3y:3
	x:6y:4
	x:10y:5
	15


	@Test
	public void reduceTest3() {
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
		// 串行流中第三个参数不起作用
		Integer reduce = list.stream().reduce(0, (x, y) -> {
			System.out.println("BiFunction  x:" + x + "y:" + y);
			return x + y;
		}, (x, y) -> {
			System.out.println("BinaryOperator  x:" + x + "y:" + y);
			return x + y;
		});
		System.out.println(reduce);
	}
	输出:
	BiFunction  x:0y:1
	BiFunction  x:1y:2
	BiFunction  x:3y:3
	BiFunction  x:6y:4
	BiFunction  x:10y:5
	15


	//Object[] toArray() 将流转化为数组
	@Test
	public void toArrayTest() {
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
		Object[] array = list.stream().toArray();
		for (Object object : array) {
			System.out.println(object);
		}
	}
	输出:
	1
	2
	3
	4
	5
	

	/*
	 * <R, A> R collect(Collector<? super T, A, R> collector)
	 * 收集器操作,收集器操作,可以当做是一种更高级的归约操作
	 */
	@Test
	public void collectionTest() {
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
		List<Integer> collectList = list.stream().collect(Collectors.toList());
		System.out.println("list:"+collectList);
		Map<Integer, Integer> map = list.stream().collect(Collectors.toMap(Integer::new, Integer::new));
		System.out.println("map:"+map);
		System.out.println("===================");
		// 平均值
		Double avg = list.stream().collect(Collectors.averagingInt(Integer::new));
		System.out.println("平均值:" + avg);
		// 最大值
		Optional<Integer> max = list.stream().collect(Collectors.maxBy(Integer::compareTo));
		System.out.println("最大值:" + max.get());
		// 总结统计
		IntSummaryStatistics intSummary = list.stream().collect(Collectors.summarizingInt(Integer::new));
		System.out.println("最大值:" + intSummary.getMax());
		System.out.println("最小值:" + intSummary.getMin());
		System.out.println("总值:" + intSummary.getAverage());
		System.out.println("平均值:" + intSummary.getSum());
		System.out.println("总数:" + intSummary.getCount());
	}
	输出:
	list:[1, 2, 3, 4, 5]
	map:{1=1, 2=2, 3=3, 4=4, 5=5}
	===================
	平均值:3.0
	最大值:5
	最大值:5
	最小值:1
	总值:3.0
	平均值:15
	总数:5

}




 

分享到:
评论

相关推荐

    C#中bitmap、stream、byte类型转换实例

    它可以用来读取、写入或操作任何类型的二进制数据,如图像数据。 3. **byte**:在C#中,byte是一个值类型,它代表8位无符号整数,取值范围是0到255。在处理图像数据时,通常会将图像的每个像素表示为一个或多个byte...

    Elecard stream eye绿色版

    二、H.264流分析 H.264是目前最广泛应用的视频编码标准之一,其高效压缩技术使得高质量视频能在有限带宽下传输。Elecard Stream Eye能细致地解析H.264编码的视频流,包括码率、帧率、分辨率、色度格式等关键参数,...

    颜色分类leetcode-ros2_deepstream:用于Jetson平台上的NVIDIADeepStream应用程序的ROS2包

    (/opt/nvidia/deepstream/deepstream/samples/) 中的一些文件。 该项目包括 ROS2 发布者节点,这些节点将单个/多个视频流作为来自网络摄像头或文件的输入: single_stream节点:这对单个视频输入执行 2 个推理任务:...

    Stream、Lambda表达式练习.doc

    第二个队伍只要姓张的,我们使用filter方法对队伍进行过滤,然后使用skip方法跳过前两个元素。最后,我们使用concat方法将两个队伍合并成一个队伍,并将结果存储到一个ArrayList集合中。 在实现中,我们首先将两个...

    Java8 Stream学习

    #### 二、Stream的基本使用 ##### 1. 创建Stream 创建Stream有多种方式: - **空流**:可以通过调用`Stream.empty()`来创建一个空的Stream。 ```java Stream&lt;String&gt; emptyStream = Stream.empty(); ``` - ...

    streamsets-帮助手册

    #### 二、管道配置 StreamSets 提供了丰富的配置选项,使用户可以根据实际需求定制数据流的行为。 **2.1 管道设计器 UI** 管道设计器提供了一个直观的用户界面,用户可以通过拖拽组件来构建数据流。 **2.2 管道...

    ASP中Adodb.Stream 组件的使用说明

    Adodb.Stream 是 ADO 的 Stream 对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作。它提供了多种方法来实现流的操作,包括 Cancel、Close、CopyTo、Flush、LoadFromFile、Open、Read、...

    Video In to AXI4-Stream v4.0 汉化手册

    二、功能摘要 Video In to AXI4-Stream v4.0 提供了以下主要功能: * 视频数据处理:支持多种视频格式和分辨率的数据处理。 * AXI4-Stream 接口:提供了高速、低延迟的数据传输接口。 * 可配置性:支持用户自定义的...

    stream 通讯

    二、Stream子类 C#中有很多Stream的子类,每个子类都针对特定的数据源或目标进行了优化: 1. 文件流:FileStream用于读写文件,如FileInputStream和FileOutputStream。 2. 网络流:NetworkStream用于处理TCP/IP套接...

    ADO Stream 数据库存储图片文件

    首先,Stream流对象是ADO的一个重要组成部分,它提供了读写二进制或文本数据的能力。这使得Stream非常适合处理像图片这样的二进制文件。在存储图片之前,我们需要先创建一个Stream对象,并将图片文件的内容加载到这...

    Elecard StreamEye多媒体视频优化压缩编码工具

    Elecard StreamEye Studio是一款功能强大专业的多媒体视频优化压缩编码工具,它可以该显示多媒体文件帧,它们的大小,类型,时间,位置和顺序流;比特率,以及其他常见的视频流参数。 2. Elecard XMuxer Pro是一个...

    adodb.stream

    `ADODB.Stream`是Microsoft ActiveX Data Objects (ADO)中的一个核心组件,它提供了一种处理数据流的方式,无论数据是文本、二进制还是其他形式。在编程中,特别是VBScript、VBA或者Classic ASP中,`ADODB.Stream`...

    02.第二节-stream基本概念.mp4

    Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以...

    C# Stream篇系列.pdf

    #### 二、Stream类的构造与基本属性 - `Stream` 类是.NET Framework中的一个抽象类,用于表示数据流。它提供了基本的读写方法,并且可以被继承以实现更具体的流类型。 - 构造函数: `Stream` 类本身只有一个受保护的...

    Node.js-concat-stream-连接一个流成字符串或二进制数据

    `concat-stream`是一个非常实用的Node.js模块,它提供了将多个流连接起来并转换为单一的字符串或二进制数据的功能。 `concat-stream`库的使用主要围绕两个核心概念:流和数据的合并。在Node.js中,流是一种处理I/O...

    Elecard StreamEye Tools

    二、H.264文件分析 H.264,又称为AVC(Advanced Video Coding),是一种高效的视频编码标准,广泛应用在高清视频、网络流媒体等领域。StreamEye Tools提供强大的H.264分析功能,可以逐帧分析编码参数,如QP值、宏块...

    Redis中stream数据类型的命令详解

    #### 二、Stream 命令详解 ##### 1. XADD - 添加新条目到 Stream **命令格式**: ``` XADD key [NOMKSTREAM] [MAXLEN | MINID [=|~] threshold [LIMIT count]] * | ID field value [field value] ``` - **作用**:...

    前端开源库-stream-concat

    // 第二个可读流 const combinedStream = streamConcat([stream1, stream2]); combinedStream.on('data', (chunk) =&gt; { // 处理合并后的数据 }); combinedStream.on('end', () =&gt; { // 所有数据已读取完毕 });...

    流批一体Streamsets Data Collector(SDC)管道Oracle CDC实时同步配置文档

    #### 二、数据库归档配置 ##### 1. 查看数据库归档状态 - **命令**: `select log_mode from v$database;` - **解释**: 此命令用于检查当前数据库是否处于归档模式。如果返回结果为`NOARCHIVELOG`,则表示未开启...

Global site tag (gtag.js) - Google Analytics