Stream API总结

1.Stream(流)的概念

流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列
那么集合和流的区别是什么呢?
集合讲的是数据,流讲的是计算。

Stream需要注意的3个地方:
1.Stream 本身是不会存储元素
2.Stream 不会改变源的对象,但是会返回一个新的源
3.Stream 操作时延迟执行的,意味着他们会等到需要结果的时候才执行。

2.Stream 操作三步骤

2.1 创建Stream

一个数据源(如:集合、数组),获取一个流。

2.1.1 Collection中的Steam()方法

List<String> list = Arrays.asList("a", "b", "c");
		Stream<String> s = list.stream();

2.1.2 Arrays类中也有Steam()方法

int[] ints = {1,2,3,4,5,6}; 
Arrays.stream(ints).forEach(System.out::println);

如果是基本数据类型该方法返回的是InStream 是java8的新特性
如果是引用类型的话和上面差不多

2.1.3 Stream类中的steam()

int[] ints = {1,2,3,4,5,6}; 
Stream s = Stream.of(ints);
s.forEach((x)-System.out.println(Arrays.toString((int[])x)));

这个方法很强大,可以接受任意数量和任意参数类型的参数
但是类型不统一不是很好操作

2.1.4 创建无限流

 //迭代
Stream<Integer> stream4=Stream.iterate(0, (x) -> x+2);
stream4.limit(10).forEach(System.out::println);
//生成
Stream.generate(() -> Math.random())
      .limit(5)
      .forEach(System.out::println);
}

这两种是无限流,可以一直生成数据,像不像一直喷水的水龙头?
迭代方法iterate()生成会从小到大的规律
而生成方法generate()里面直接放Supolier接口类,会根据你的方法具体而生成数字

2.2 中间操作

一个中间操作链,对数据源的数据进行处理

2.2.1 筛选和切片

在这里插入图片描述
以上四种方法比较常见 实例代码如下

// filter过滤
// employees.stream().filter((x)->x.getAge()<3).forEach(System.out::println);;
// limit限制个数
// skip跳过个数
// employees.stream().skip(1).forEach(System.out::println);
// distinct 去重(这个需要重写一下hashCode()和equals())
// employees.stream().distinct().forEach(System.out::println);;

2.2.2 映射

在这里插入图片描述
主要是用map和flatmap代码如下

@Test
public void test3() {
// map
employees = Arrays.asList(new Employee(1, 2), new Employee(2, 3), new Employee(3, 4), new Employee(4, 5),
new Employee(5, 6));
// employees.stream().map((x)->x.getSalary()).forEach(System.out::println);
// flatmap
List<String> list = Arrays.asList("1111", "222", "322", "43", "74", "57");
// list.stream().flatMap(TestSteam::getChartacter).forEach(System.out::println);;

}

public static Stream<Character> getChartacter(String str) {
List<Character> list = new ArrayList<Character>();
char[] chs = str.toCharArray();
for (char c : chs) {
list.add(c);
}
return list.stream();
}

flatmap的意义在于,一般的java方法都是返回一个结果,但是对于结果数量不确定的时候,用map这种java方法的方式,是不太灵活的,所以引入了flatmap。
比如上面的List< String >类,只用map我们很难讲所有的字符提取出来编变成一个流

2.2.3 排序

@Test
	public void test4() {
// map
employees = Arrays.asList(new Employee(1, 6), new Employee(2, 2), new Employee(3, 8), new Employee(4, 4),
new Employee(5, 1));
// employees.stream().sorted().forEach(System.out::println);
// employees.stream().sorted((e1,e2)->{
// return e1.getSalary()-e2.getSalary();
// }).forEach(System.out::println);
	}

2.3 终止操作

一个终止操作,执行中间操作链,并产生结果

2.3.1 查找与匹配

在这里插入图片描述
在这里插入图片描述

2.3.2 归约

在这里插入图片描述

2.3.3 收集

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值