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 终止操作
一个终止操作,执行中间操作链,并产生结果