Stream API

​ 产生一个全新的流,和数据源没有关系(数据源不受影响)

a)创建stream方式:

​ 1)collection 例如:new ArrayList<>().stream()

​ 2)数组 Arrays.stream()

​ 3)通过Stream类中的静态方法of()

​ 4)创建无限流

//创建无线流 — 迭代方式
@Test
public void test1() {
	Stream<Integer> stream = Stream.iterate(0,(x) -> x+2);
	stream.limit(10).forEach(System.out::println);
}
//创建无线流  ——生成
	@Test
	public void test2() {
		Stream.generate(() ->Math.random()).limit(5).forEach(System.out::println);
	}
b)中间操作

​ 1)筛选与切片

filter——接收Lambda,从流中排除某些元素。

@Test
public void test3() {//stream有内部迭代
	//中间操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{//filter就是中间操作
		System.out.println("开始执行判断");
		return e.getAge()>35;
	});
	/**
	终止操作:一次性执行全部内容,就是“惰性求值”;
	例如:在没有进行终止操作的情况下所有的中间操作都不会执行,只有当执行了终止操作,中间操作才会全部一次性执行!!
	**/
	stream.forEach(System.out::println);//打印就是终止操作!
}

limit——截断流,使其元素不超过给定数量

@Test
public void test3() {
	//中间操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{
		System.out.println("开始执行判断");
		return e.getAge()>35;
	}).limit(1).forEach(System.out::println);//限制为1条
}

skip(n)——跳过元素,例如集合中一共有五个元素,skip(2)就是跳过前两个,留下后三个;若流中元素不足n个,则返回一个空流。与limit(n)互补

distinct——筛选(去重),通过流所生成的元素hashcode() 和equals()去除重复的元素

​ 2)映射(Map)

​ map——接收lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

​ flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有的流连接成一个流。

//映射
@Test
public void test4() {
	emplpoyees.stream().map(Employee::getName).forEach(System.out::println);
	}

​ 3)排序

​ sorted() :自然排序(Comparable)

@Test
	public void test5() {
		List<String> list1 = Arrays.asList("bbb","ccc","aaa","ddd");
		list1.stream().sorted().forEach(System.out::println);
	}

​ sorted(Comparator com):定制排序

c)终止操作

以下为终止操作常用的各个方法:

​	allMatch

​	anyMatch

​	noneMatch

​	findFirst

​	findAny

​	count

​	max

​	min
d)规约

​ reduce(T identity,BinaryOperator) / reduce(BinaryOperator) 可以将流中元素反复结合起来,得到一个值。

@Test
public void test1() {
	List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
	// T reduce(T identity, BinaryOperator<T> accumulator);
	Integer sum = list.stream().reduce(0, (x,y) -> x+y);
	System.out.println(sum);//55
    
    //需求:获取员工类中的所有工资的总和(map-reduce规约实现)
    Optional<Double> op = emplpoyees.stream().map(Employee::getSarlary).reduce(Double::sum);
		System.out.println(op.get());
}
e)收集

​ collect——将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

//需求:将员工类中的所有名字收集到集合list中
public void test2() {
    /**
    	Employee::getName(方法引用的第三种方式————类::实例方法名);实例方法就是非静态方法
    	Collectors这是一个集合收集的工具类,里边包含了许多静态方法
    */
	List<String> list = emplpoyees.stream().map(Employee::getName).collect(Collectors.toList());
	list.forEach(System.out::println);
}
//set实现上一个需求(set可以将员工集合中的重复名字的员工去重)
@Test
public void test3() {
	Set<String> set = emplpoyees.stream().map(Employee::getName).collect(Collectors.toSet());
	set.forEach(System.out::println);
}
//
@Test
public void test4() {
	Long count = emplpoyees.stream().collect(Collectors.counting());
	System.out.println(count);
	
	Double avg = emplpoyees.stream().collect(Collectors.averagingDouble(Employee::getSarlary));
	System.out.println(avg);
	
	Double sum = emplpoyees.stream().collect(Collectors.summingDouble(Employee::getSarlary));
	System.out.println(sum);
}

​ 收集方式除了以上这些之外还有,groupingBy(多级分组)、partitioningBy(分区)、joining(连接)等方法,可根据需求查询API文档。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐