Java8集合流操作
一、集合流操作:
多的不说直接贴(过滤、排序、聚合以及汇总demo)代码:
/**
* Created by wangk on 2019-03-10.
*/
@Data
public class User {
private int id;
private String name;
private String classNo;
private int age;
public User(int id, String name, String classNo, int age) {
this.id = id;
this.name = name;
this.classNo = classNo;
this.age = age;
}
}
class StreamTest{
public static void main(String[] args) {
User user1 = new User(1, "张三", "no1", 27);
User user2 = new User(2, "李四", "no2", 15);
User user3 = new User(3, "王五", "no1", 24);
User user4 = new User(4, "赵六", "no3", 15);
User user5 = new User(5, "李七", "no1", 29);
User user6 = new User(6, "钱八", "no3", 18);
User user7 = new User(7, "孙九", "no1", 25);
User user8 = new User(8, "周十", "no2", 19);
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
list.add(user7);
list.add(user8);
//List转map:把list里面的元素拿出来作为map的value,自己定义key
//a->a, (k1,k2)->k1: 如果有重复的key就返回第一个
Map<Integer, User> map1 = list.stream().collect(Collectors.toMap(User::getId, a->a, (k1,k2)->k1 ));
System.out.println("map1");
System.out.println(map1);
//过滤Filter
List<User> map2 = list.stream().filter(a -> a.getAge()>20).collect(Collectors.toList());
System.out.println("map2");
System.out.println(map2);
//排序sort
List<User> map3 = list.stream().sorted(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getAge()-o2.getAge();
}
}).collect(Collectors.toList());
System.out.println("map3");
System.out.println(map3);
//求最大最小值
Optional<User> user = list.stream().max(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
int n1 = Integer.parseInt(o1.getClassNo().substring(2, 3));
int n2 = Integer.parseInt(o2.getClassNo().substring(2, 3));
return n2-n1;
}
});
System.out.println("user");
System.out.println(user);
//遍历修改数据
list.stream().forEach(p -> {
if ("张三".equals(p.getName())) {
p.setClassNo("no3");
}
});
System.out.println("list");
System.out.println(list);
//分组
Map<String, List<User>> map6 = list.stream().collect(Collectors.groupingBy(User::getClassNo));
System.out.println("map6");
System.out.println(map6);
//groupingBy三个参数值是:1、分组字段 2、结合类型(默认是HashMap) 3、Coolections.toList()
//因为HashMap是无序的,所以这里我们使用LinkHashMap
//步骤:过滤 -> 排序 -> 分组
LinkedHashMap<String, List<User>> map = list.stream().filter(a -> a.getAge()<29)
.sorted(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
int n1 = Integer.parseInt(o1.getClassNo().substring(2, 3));
int n2 = Integer.parseInt(o2.getClassNo().substring(2, 3));
return n2-n1;
}
})
.collect(Collectors.groupingBy(
User::getClassNo,
LinkedHashMap::new,
Collectors.toList()));
System.out.println("map");
System.out.println(map);
}
}
Stream常用方法:
Collectors 类的静态工厂方法:
工厂方法 | 返回类型 | 作用 |
---|---|---|
toList | List | 把流中所有项目收集到一个 List |
toSet Set | 把流中所有项目收集到一个 Set,删除重复项 | |
toCollection | Collection | 把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new) |
counting | Long | 计算流中元素的个数 |
sumInt | Integer | 对流中项目的一个整数属性求和 |
averagingInt | Double | 计算流中项目 Integer 属性的平均值 |
summarizingInt | IntSummaryStatistics | 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值 |
joining | String | 连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", ")) |
maxBy | Optional | 一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty() |
minBy | Optional | 一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty() |
reducing | 归约操作产生的类型 | 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum)); |
collectingAndThen | 转换函数返回的类型 | 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size)) |
groupingBy | Map<K, List> | 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键 |
partitioningBy | Map<Boolean,List> | 根据对流中每个项目应用谓词的结果来对项目进行分区 |