
前言
java 8 允许你用一种流式操作处理集合的元素,可以把集合的数据看成水流,水流要得到处理最终从管道末端出来,管道中每处设立了一个结点代表对流进行处理,比如 filter() 之类的方法,然后从每个结点出来的仍然是 Stream 流
stream 与 parallelStream
- 串行流 stream
- 并行流 parallelStream
此文只做串行流 stream 的简介,并行流以后会在另一篇博文介绍
集合类使用流
方式一
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
方式二
List<String> list = new ArrayList<>();
Stream<List<String>> stream = Stream.of(list);
数组使用流
方式一
String[] arr = {"1", "2", "3"};
Stream<String> stream = Stream.of(arr);
方式二
String[] arr = {"1", "2", "3"};
Stream<String> stream = Arrays.stream(arr);
Stream 接口常用方法
- map()
将每个元素变成什么map(i -> i*i)
- filter()
用来过滤元素filter(str-> str.isEmpty())
- sum()
求和 - distinct()
剔除重复的 - sort()
排序 - forEach()
遍历
list 处理举例
// 保留 n % 2 == 0 的数据
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
int sum = numbers.stream()
.mapToInt(Integer::intValue)
.sum();
map 处理举例
Map<String, Integer> passingScores = scoreMap.entrySet().stream()
.filter(e -> e.getValue() >= 80)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<String, String> gradeMap = scoreMap.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue() >= 90 ? "A" : "B"
));
// 合并 map,即 map1,map2 中 key 相同的则 value 相加
Map<String, Integer> mergedMap = Stream.of(map1, map2)
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1 + e2
));
// key 和 value 后分别追加字符
Map<String, String> modifiedMap = originalMap.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(
entry.getKey() + "a", // 修改键:添加字符 "a"
entry.getValue() + "b" // 修改值:添加字符 "b"
))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));