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

Stream(一)

 
阅读更多
import java.time.LocalDate;
import java.util.Objects;

public class Employee {
	private String name;
	private Double salary;
	private Integer age;
	private LocalDate hireDay;
	
	public Employee() {
		super();
	}

	public Employee(String name,Double salary,Integer age, LocalDate hireDay) {
		super();
		this.name=name;
		this.salary = salary;
		this.age=age;
		this.hireDay = hireDay;
	}
        //省略get set hashCode equals toString方法
        ··············
}

 

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

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

public class StreamIntermediateTest {
	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))
	};
	@Test
	public void createStream() {
		//of(T...t)方法传入元素可以获得一个有限长度的流
		Stream<Integer> of = Stream.of(1,2,3,4,5);
		
		//generate(supplier<T> s)方法可以获得一个无限长度的流
		Stream<Random> generate = Stream.generate(()->new Random());
		
		//iterate(final T seed, final UnaryOperator<T> f)方法也可以获取一个无限长度的流,
		//seed指定元素的种子  f的方法对给指定的元素种子迭代而产生无限连续有序Stream
		//可以认为是:把1作为参数传给了f的apply()方法无限循环+1
		Stream<Integer> iterate = Stream.iterate(1,(x)->x+1);
		
		//empty()方法返回一个空的Stream,不包含任何元素项。
		Stream<Object> empty = Stream.empty();
		
		//使用集合中的stream()方法可以获取一个流
		//parallelStream()方法可以获取一个并行流
		List<Integer> list = Arrays.asList(1,2,3,4,5);
		Stream<Integer> stream = list.stream();
		Stream<Integer> parallelStream = list.parallelStream();
	}
	
	// 中间操作(返回值是Stream)
	//filter(Predicate<? super T> predicate)  过滤出符合条件的元素
	@Test
	public void filterTest() {
		List<Employee> list = Arrays.asList(e);
		list.stream()
			.filter((e)->e.getName().equals("阿七"))
			.forEach(System.out::println);
	}
	输出:	
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	

	//limit(long maxSize)	获取流中的前几个元素
	@Test
	public void limitTest() {
		List<Employee> list = Arrays.asList(e);
		Stream<Employee> limit = list.stream().limit(3);
		limit.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]


	//skip(long n)  过滤掉前几个元素,获取剩下的元素
	@Test
	public void skipTest() {
		List<Employee> list = Arrays.asList(e);
		Stream<Employee> skip = list.stream().skip(3);
		skip.forEach(System.out::println);
	}
	输出:
	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]


	//sorted(Comparator<? super T> comparator) 将流进行排序,返回一个有序的新流(无参方法为基本类型排序)
	@Test
	public void sortedTest() {
		List<Employee> list = Arrays.asList(e);
		//这里根据年龄排序
		Stream<Employee> sorted = list.stream().sorted((x,y)->x.getAge().compareTo(y.getAge()));
		sorted.forEach(System.out::println);
	}
	输出:
	Employee [name=李四, salary=400.0, age=20, hireDay=1999-01-13]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	Employee [name=阿七, salary=400.0, age=22, hireDay=1998-10-19]
	Employee [name=王五, salary=700.0, age=23, hireDay=1997-11-27]
	Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]
	Employee [name=赵六, salary=900.0, age=26, hireDay=1994-07-06]


	//distinct()   除去流中的重复元素    需要重写Employee类的 hashCode() equals()方法
	@Test
	public void distinctTest() {
		List<Employee> list = Arrays.asList(e);
		Stream<Employee> distinct = list.stream().distinct();
		distinct.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]


	/* concat(Stream a,Stream b)   Stream的静态方法 把两个流合并成一个新流
	 *  若两个输入的Stream都串行的,则新Stream也是串行的;
	 *  若输入的Stream中任何一个是并行的,则新的Stream也是并行的;
	 *  若关闭新的Stream时,原两个输入的Stream都将执行关闭处理。
	 */	
	@Test
	public void concatTest() {
		Stream<Integer> concat = Stream.concat(Stream.of(4,2,0), Stream.of(3,1));
		concat.forEach(System.out::println);
	}
	输出:
	4
	2
	0
	3
	1

	/* 
	 * peek(Consumer<? super T> action)  生成一个包含原Stream的所有元素的新Stream,
	 * 	同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都
	 * 	会执行给定的消费函数(原Stream也会跟着执行但不进行消费操作),并且消费函数优先执行
	 */
	@Test
	public void peekTest() {
		List<Employee> list = Arrays.asList(e);
		Stream<Employee> peek = list.stream().peek((e)->System.out.println(e.getName()));
		peek.limit(1).forEach(System.out::println);
	}
	输出:
	张三
	Employee [name=张三, salary=500.0, age=25, hireDay=1995-03-07]


	/*
	 * map(Function<? super T, ? extends R> mapper)	将元素转化为其他形式或提取信息,
	 * 	传入Function对象调用的apply()方法会应用到每一个元素,
	 * 	并将其映射为一个新的元素。
	 */
	@Test
	public void mapTest() {
		String[] s= {"aaa","bbb","ccc"};
		List<String> list = Arrays.asList(s);
		Stream<String> map = list.stream().map(String::toUpperCase);
		map.forEach(System.out::println);
		System.out.println("=====================");
		Stream<Stream<Character>> map2 = list.stream().map(StreamIntermediateTest::toCharacter);
		map2.forEach((stream)->{
			stream.forEach(System.out::println);
		});
	}
	输出:
	AAA
	BBB
	CCC
	=====================
	a
	a
	a
	b
	b
	b
	c
	c
	c


	/* 
	 * flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 
	 * 	传入Function对象调用的apply()方法会应用到每一个元素,并将其映射为一个新的元素。
	 * 	把所有的流连接为一个流
	 */
	@Test
	public void flatMapTest() {
		String[] s= {"aaa","bbb","ccc"};
		List<String> list = Arrays.asList(s);
		Stream<Character> flatMap = list.stream().flatMap(StreamIntermediateTest::toCharacter);
		flatMap.forEach(System.out::println);
	}
	输出:
	a
	a
	a
	b
	b
	b
	c
	c
	c

	public static Stream<Character> toCharacter(String s){
		ArrayList<Character> list = new ArrayList<Character>();
		for (Character character : s.toCharArray()) {
			list.add(character);
		}
		return list.stream();
	}
}



 

分享到:
评论

相关推荐

    Stream-2-Stream

    Stream-2-Stream是一个开源项目,其主要目的是实现流与流之间的通信,即Stream-to-Stream通信。这个项目的核心在于创建一个高效、可靠且灵活的框架,使得不同数据流能够实时、双向地交换信息。从提供的文件列表来看...

    Linux内存性能测试工具stream

    "Linux内存性能测试工具stream"是一个专门用于评估计算机内存(RAM)性能的工具。本文将深入探讨STREAM的作用、工作原理以及如何在Linux环境中使用它。 STREAM,全称是“Simple Triad Memory Benchmark”,是由John...

    streamEye绿色版本

    streamEye是一款专为音视频分析设计的工具,尤其在处理H264编码格式的视频时表现出色。这款工具在Windows平台上提供了免费的绿色版本,无需安装,下载解压后即可使用,方便快捷。streamEye的主要功能是帮助用户深入...

    deepstream sdk 2.0

    DeepStream SDK 2.0是NVIDIA推出的一款专门用于智能视频分析的软件开发工具包,它基于开放源码的GStreamer框架构建而成,结合了GPU和CPU的异构并行处理能力,以及对并行化和同步的隐藏处理,天然支持多线程操作。...

    Stream、Lambda表达式练习.doc

    在Java中,Stream API是Java 8中引入的一种新的数据处理方式,它可以对集合进行各种操作,如过滤、映射、聚合等。Lambda表达式是Java 8中引入的一种新的函数式编程方式,它可以将函数作为参数传递给其他函数。 ...

    deepstream-test1-app_rtsp-master基于Deepstream实现RTSP视频流的读取

    【标题】"deepstream-test1-app_rtsp-master"是一个项目,专注于使用Deepstream库来处理RTSP(Real-Time Streaming Protocol)视频流。这个项目的核心是用C++编程语言编写的源代码,它允许用户从RTSP服务器接收视频...

    Java Stream 流实现合并操作示例

    Java Stream 流实现合并操作示例是 Java Stream Api 的一个重要应用场景。在实际开发中,我们经常需要将多个 Stream 流合并成一个流,以便进行后续的数据处理。今天,我们将详细介绍 Java Stream 流实现合并操作的...

    Elecard_StreamEye_Tools.rar_Elecard StreamEye _elecard使用教程_mark7

    Elecard StreamEye Tools是一款专业的视频文件分析软件,尤其在处理ES( Elementary Stream)层的数据时表现出强大的功能。这款工具为视频工程师、开发者以及质量控制专业人员提供了深入洞察视频流内部结构的能力,...

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

    最后,我们可以使用Image.FromStream方法从Stream创建一个新的Bitmap对象。 ```csharp Bitmap restoredBitmap = Image.FromStream(imageStream) as Bitmap; // 从Stream还原Bitmap ``` 以上就是C#中Bitmap、Stream...

    一个不过期的绿色的Elecard StreamEye Tools.rar

    Elecard StreamEye Tools是一款强大的流媒体分析工具集,主要用于对H.264编码的视频流进行深入解析和诊断。这个不过期的绿色版本确保了用户可以长期无限制地使用这些功能,而无需担心软件的有效期问题。在压缩包中,...

    deepstream test5

    【标题】"deepstream test5" 是一个与深度学习流处理相关的项目,它可能是NVIDIA提供的一个用于视频分析和智能物联网(IoT)应用的开源平台。DeepStream SDK结合了GPU加速的计算机视觉、视频解码和分析,使得开发者...

    Elecard-StreamEye-Tools.zip_Elecard_Elecard StreamEye _elecard工具

    Elecard StreamEye Tools是一款专为视频压缩领域设计的专业工具集,它以其强大的功能和深入的分析能力,深受业界专业人士的喜爱。这款软件旨在帮助用户对视频序列进行全方位、深层次的检查与分析,确保视频质量和...

    streamsets.tgz

    StreamSets 是一个强大的数据集成平台,专为现代大数据架构设计,提供数据流管理和处理功能。其Data Collector是该平台的核心组件,允许用户构建、运行和监控数据管道,将数据从各种源传输到不同的目标。标题提到的 ...

    stringstream的应用

    在上面的代码中,我们首先建立了一个 stringstream 对象,然后使用操作符将 int 类型数据插入 stream 对象中,最后使用操作符&gt;&gt;抽取数据到一个 string 对象中。 如果我们想使用同一个 stringstream 对象实现多种...

    深入理解Dart的Stream

    Dart 的 Stream 是一个非常有用的工具,用于处理异步事件。它能够帮助应用处理诸如请求网络、用户交互等问题。在这里,我们将深入了解 Dart 的 Stream,了解它的概念、特点和使用方法。 什么是 Stream Stream 是一...

    axi stream 仿真模型,可用modelsim仿真

    AXI (Advanced eXtensible Interface) Stream 是一种广泛用于高性能数字系统设计的数据接口标准,由ARM公司提出。它主要用于高速数据传输,特别是在FPGA和ASIC设计中。AXI Stream 提供了一种单向、无握手的数据流...

    streamsets-帮助手册-.pdf

    StreamSets 是一个数据integration平台,用于处理和处理大规模数据流。以下是根据 StreamSets 帮助手册生成的知识点: Pipeline 概念和设计 Pipeline 是 StreamSets 的核心概念,用于描述数据流的处理过程。...

    Java8 Stream学习

    在Java8中,Stream 是一项重要的新增特性,它提供了一种全新的处理集合数据的方式。不同于传统的集合类(如List、Set等),Stream API支持更加灵活的数据处理方式,使得开发人员能够以声明式的方式来处理数据。 **...

    Elecard StreamEye Studio 3.1(含2.9.0)

    Elecard.Streameye.v3.1,是一个强大的视频序列或码流分析软件,YUV分析,264文件分析软件,H.264视频编解码学习必备的东西,Elecard StreamEye Suite是一套用于专业视频压缩领域的功能强大的工具 ,能够帮助用户...

    Elecard stream eye绿色版

    Elecard Stream Eye是一款备受推崇的专业视频分析工具,尤其对于处理H.264编码的流媒体内容,它提供了详尽的解析与诊断功能。本文将深入探讨这款工具的核心特点、使用场景及其在YUV数据和流媒体分析中的重要作用。 ...

Global site tag (gtag.js) - Google Analytics