Java8
集合遍历之Stream流
1、获取流
1.1 List、Set、vector获取流
所有的Collection集合都可以通过stream默认方法获取流
List<String> list = new ArrayList(); list.stream(); Set<String> set = new Set(); set.stream(); Vector<String> vector = new Vector<>(); vector.stream();
1.2 Map获取流
java.util.Map
接口不是Collection的子接口,其数据结构为K-V键值对,获取流需要分key、value或entry等情况
Map<String,Object> map = new HashMap<>(); Stream<String> keyStream = map.keySet().stream(); Stream<Object> valueStream = map.values().stream(); Stream<Map.Entry<String,Object>> entryStream =map.entrySet().stream();
1.3 数组获取流
数组不属于集合,没有默认方法,使用Stream接口中提供的类方法of()
String[] array = {"张三","李四","王五"}; Stream<String> stream = Stream.of(array);
2、常用方法
方法名 | 方法作用 | 是否支持链式调用 |
---|---|---|
count | 统计个数 | 否 |
forEach | 遍历逐一处理 | 否 |
filter | 过滤 | 是 |
limit | 取前几个,截取元素 | 是 |
skip | 取后几个,截取元素 | 是 |
map | 映射 | 是 |
concat | 组合 | 是 |
2.1 count (统计个数)
long count() 返回值为long ,用于返回集合元素的个数
List<String> list =List.of("张三","李四","王五"); Stream<String> stream = list.stream(); stream.count(); // 3
2.2 forEach
: 逐一处理
注:用于循环遍历,但不能保证元素逐一执行动作能有序执行
List<String> list =List.of("张三","李四","王五"); Stream<String> stream = list.stream(); stream.forEach( s -> System.out.println(s));
2.3 filter(过滤)
将steam流转换为另一个子集流,用于过滤操作
Stream<T> filter(Predicate<? super T> predicate);
List<String> list =List.of("张三","李四","王五"); Stream<String> stream = list.stream(); stream.filter(s -> s.startsWith("李")).forEach(System.out::println); //李四
2.4 limit (截取指定长度)
对当前流进行截取,指定截取长度
Stream<T> limit(long maxSize);
List<String> list =List.of("张三","李四","王五"); List<String> list1 = new ArrayList<>(); list.stream().limit(2).forEach(s -> list1.add(s)); System.out.println(list1); //[张三, 李四]
2.5 skip (从指定长度开始截取)
对当前流进行截取,从当前长度开始截取
Stream<T> skip(long n);
List<String> list =List.of("张三","李四","王五"); List<String> list1 = new ArrayList<>(); list.stream().skip(2).forEach(s -> list1.add(s)); System.out.println(list1); //[王五]
2.6 map(映射)
将流中的元素映射到另一个流中
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
List<String> list =List.of("1","2","3"); Stream<Integer> stream = list.stream().map(s -> Integer.parseInt(s));
2.7 concat
(组合,合并流)
将两个流合并为一个流,是属于Stream中的静态方法
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
Stream<String> streamA = Stream.of("张三"); Stream<String> streamB = Stream.of("李四"); Stream<String> result = Stream.concat(streamA, streamB);
3、收集Stream结果
3.1 收集到集合中
使用collect方法,配合使用java.util.stream.Collectors
类提供的方法
public static <T> Collector<T, ?, List<T>> toList():转换为List集合。 public static <T> Collector<T, ?, Set<T>> toSet():转换为Set集合。
Stream<String> stream = Stream.of("10", "20", "30", "40", "50"); List<String> list = stream.collect(Collectors.toList()); //[50, 40, 30, 20, 10] Set<String> set = stream.collect(Collectors.toSet()); //[50, 40, 30, 20, 10]
3.2 收集到数组中
Stream提供toArray方法来将结果放到一个数组中,由于泛型擦除的原因,返回值类型是Object[]的
Object[] toArray();
Stream<String> stream = Stream.of("10", "20", "30", "40", "50"); Object[] objArray = stream.toArray();
注:
如果数据在1万以内的话,for循环效率高于foreach和stream;如果数据量在10万的时候,stream效率最高,其次是foreach,最后是for。另外需要注意的是如果数据达到100万的话,parallelStream异步并行处理效率最高,高于foreach和for,在处理大数据的情况下,尽量使用stream流操作