JavaSE-Stream流

JavaSE-Stream流

从流的出生,经过过滤,排序,去重等各种方法,变成最后的结果,就像水流一样,在代码层面也类似地简单明了,最大的优点是不用自己去保存中间状态,而是可以一直往后操作,直到遇到Stream的终结方法,也像水流一样,Stream流使用后就会改变,一般只用一遍。

1.获取Stream流

一般集合都提供了stream方法,只需要.stream()就可以获取。比如

1
2
Set<String> set = new HashSet<>();
Stream<String> stream = set.stream();

但Map除外,Map用以下方法获取流:

  1. keySet()获取Key的Set后stream或者values()获取Value的Set后stream
  2. entrySet()转化为包含Map.Entry的Set后stream

一般建议用第二种,毕竟Key+Value才是Map的精髓,下面代码里的Entry可以理解为Pair(一对)。

1
2
Map<String, Double> map = new HashMap<>();
Stream<Map.Entry<String, Double>> stream = map.entrySet().stream();

Arrays数组可以通过以下方式获得Stream

  1. Arrays.stream(YourArrays)
  2. Stream.of(YourArrays)

2.常用的Stream的中间方法

filter使用lambda式判断条件作为过滤,例如:

1
2
3
4
5
6
7
8
List<Double> scores = new ArrayList<>();
Collections.addAll(scores, 88.5, 108.8, 60.0, 99.0, 9.5, 99.6, 25.0);
//需求1:找出成绩人于等于60分的数据,并升序后,可输出。
List<Double> list1 = scores.stream()
.filter(s -> s > 60)
.sorted()
.collect(Collectors.toList());
System.out.println(list1);

sorted排序,limit限制数量,skip跳过,distinct去重,都比较简单。其中sorted需要重写排序规则,在集合体系已经讲过,distinct需要重写hashCode和equals,如果是Java自带的基础集合,都不用管这些。

map操作接收一个函数作为参数,支持lambda,比如

1
2
3
4
List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5); 
List<String> strList = numList.stream()
.map(n -> n.toString())
.collect(Collectors.toList());

concat合并流,后者接在前者后面,比如

1
2
3
4
Stream<String> stream1 = Stream.of("张三", "李四");
Stream<String> stream2 = Stream.of("张三2", "李四2", "王五");
Stream<String> streamAll = Stream.concat(stream1, stream2);
streamAll.forEach(s -> System.out.println(s));

3.常用的终结方法

collect里面填诸如Collectors.toList(),Collectors.toSet(),to什么就用什么接收结果。

1
2
.collect(Collectors.toList());
.collect(Collectors.toMap(Student::getName, Student::getHeight))
作者

Xiamu

发布于

2023-10-13

更新于

2024-08-11

许可协议

评论