Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
1.使用Stream首先是获取流,以List、Map和数组为例
//List获取流
List list = Arrays.asList("item1", "item2", "item3", "item4", "item5");
Stream stream = list.stream();
//Map获取流
Map map = new HashMap<>();
//获取key的流
Stream stream1 = map.keySet().stream();
//获取value的流
Stream stream2 = map.values().stream();
//获取键值对的流
Stream> stream3 = map.entrySet().stream();
//数组获取流
String[] str = {"111", "222", "333"};
Stream stream4 = Stream.of(str);
2.Stream的常用方法
forEach()
方法,遍历流并打印每个元素。
stream.forEach(System.out::println);
count()
方法,用于返回当前Stream流中元素个数,返回值为long类型
。
long count = stream.count();
limit()
和skip()
方法,limit()用于截取前几个元素,而skip()用于删除前几个元素(如果超过总量,返回空)。
//保留前3个元素
Stream limit = stream.limit(3);
/*
stream只能被操作一次,否则会报错:stream has already been operated upon or closed
保留后3个元素
*/
Stream skip = stream.skip(2);
filter()
方法接受一个函数接口当作筛选条件,保留满足条件的元素。
//获取元素是item3的流
Stream item3 = stream.filter(s -> s.equals("item3"));
map()
方法,用于对流中的元素进行加工。该方法的形参也是一个函数式接口。
//对流中的每个元素拼接map字符串
Stream stringStream = stream.map(s -> s + "map");
concat()
方法,用于拼接两个流。如果两个流的泛型不同,返回类型可以为Object类型
。
List list1 = Arrays.asList( "item6");
Stream stream5 = list1.stream();
Stream concat = Stream.concat(stream, stream5);
reduce()
方法,实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。
//初始值为3,计算3依次乘以list里面的各个元素的积
List list = Arrays.asList(1, 2, 4, 2, 6, 7);
//结果为2016
Integer reduce = list.stream().reduce(3, (m, n) -> m * n);
3.Stream再次转化为集合或者数组
collect()
方法用于将流转化为集合。
//转化为List
List collect = stream.collect(Collectors.toList());
//转化为Set
Set set= stream.collect(Collectors.toSet());
toArray()
方法用于将流转化成数组。
//默认数组是Object类型
Object[] objects = stream.toArray();
//指定转化后的类型
String[] strings = stream.toArray(String[]::new);