Stream流的常用方法 |
流的操作分为两种,中间操作与终止操作,中间操作会返回一个新的流,例如distinct()方法。终止操作后流将不能再使用,例如count() 方法。stream流操作是延迟执行的 ,一旦执行终止操作,就执行中间操作链,并产生结果
代码示例:
public class User {
private String name;
private String sex;
private int age;
......
}
public class Demo{
static List<User> users = Arrays.asList(
new User("a", 11,"男"),
new User("c", 11,"女"),
new User("s", 21,"男"),
new User("o", 16,"女"));
static Stream<User> stream = users.stream();
public static void main(String[] args) {
test1();
}
//打印
public static void test1(){
stream.forEach((user)-> System.out.println(user.toString())
);
}
//去重统计
public static void test2(){
System.out.println(stream.distinct().count());
}
// 过滤
public static void test3(){
stream.filter((user)->user.getAge()>10).forEach(System.out::println);
}
//切片
public static void test4(){
stream.limit(2).forEach(System.out::println);
}
//数据跳过(跳过前两个数据)
public static void test5(){
stream.skip(2).forEach(System.out::println);
}
//映射(接受一个方法,该方法将作用到集合的每一个元素上,将其映射成一个新的元素)
public static void test6(){
stream.map((user -> user.getName())).forEach((u)-> System.out.println(u));
}
//匹配
public static void test7(){
//任意,返回true
//System.out.println(stream.allMatch(user -> user.getAge() > 20));
// 存在,返回true
System.out.println(stream.anyMatch(user -> user.getAge() > 20));
}
//归约
public static void test8(){
//计算集合元素和
List<Integer> list = Arrays.asList(1, 2, 3, 4);
System.out.println(list.stream().reduce(0, (i1, i2) -> i1 + i2));
}
//获取流中最大值,最小值
public static void test9(){
List<Integer> list = Arrays.asList(1, 2, 3, 4);
if (list.stream().reduce(Math::max).isPresent()){
System.out.println(list.stream().reduce(Math::max));
}
if (list.stream().reduce(Math::min).isPresent()){
System.out.println(list.stream().reduce(Math::min));
}
}
//分组
public static void test10(){
//按年龄分组
/*Map<Integer, List<User>> collect = stream.collect(Collectors.groupingBy(User::getAge));
System.out.println(collect);*/
//多级分组(先按年龄分组,再按性别分组)
Map<Integer, Map<String, List<User>>> collect = stream.collect(Collectors.groupingBy(User::getAge,Collectors.groupingBy(User::getSex)));
System.out.println(collect);
}
//分组统计
public static void test11(){
//按年龄分组后统计
Map<Object, Long> collect = stream.collect(Collectors.groupingBy(user -> user.getAge(),Collectors.counting()));
System.out.println(collect);
}
}