java stream 操作和 Collectors收集
stream 操作
- 流操作分为转换流和终止流
转换流
- filter()
- map
- limit()
- distinct()
- sort()
- peek()
终止流
- max()
- min()
- count()
- findAny()
- anyMatch()
- reduce()
- iterator()
- forEach()
- collect()
Collectors
Collectors大致有以下几种收集方法
- toList()
- toSet()
- toMap()
- groupingBy()
- partitioningBy()
- averagingInt()
- summingInt()
- counting()
- joining()
- mapping()
比较实用的收集操作示例
- 示例1:提供一个用户列表,根据所有用户的姓名拼串拼成如"令狐冲、任盈盈、东方不败;" 这种格式的字符串
- joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
这里使用收集器的joining方法,三个参数是终结符、前缀、后缀只填终结符默认前后缀都是空
users.stream().map(User::getUsername).collect(Collectors.joining(";"));
- 示例2:提供一个用户列表和文章列表,找出所有不是在用户列表中用户写的文章
articles.stream().filter(article ->
users.stream().noneMatch(user -> user.getId().equals(article.getUserid())))
.collect(Collectors.toList());
- 示例3:提供一个文章列表,根据类型分组文章
articles.stream().collect(Collectors.groupingBy(Article::getType));
这里有一个小点groupingBy,partitioningBy的区别,大家根据参数和返回值应该能看出来
Map<String, List<Article>> collect1 = articles.stream().collect(Collectors.groupingBy(Article::getType));
Map<Boolean, List<Article>> collect2 = articles.stream().collect(Collectors.partitioningBy(t -> t.getType().equals("1")));
- 示例4 提供一个文章列表,根据类型分组文章并求每个类型文章对映的浏览量
Map<String, Integer> map = articles.stream()
.collect(Collectors.groupingBy(Article::getType,
Collectors.reducing(0, Article::getVisits, Integer::sum)));