Java的stream的流操作

1、string类型

@Test
void test6(){
    String[] persons = {"张三丰", "张翠山", "张无忌", "金毛狮王", "小昭", "张无忌"};
    Stream.of(persons)
            .distinct()  //去重,踢掉一个 张无忌
            .filter(s -> s.length()>=3)  //过滤掉名字长度<3的,小昭
            .filter(s -> s.startsWith("张"))  //过滤掉不是姓张的,金毛狮王
            .sorted()  //对人物进行排序
            .forEach(System.out::println);
}

2、Integer类型

stream中有专门处理数字类型的流,这里就以int为例,Long和Double类型跟Integer类型一样。
可以看到我们虽然使用的是IntStream但是返回的类型是Double类型的。

@Test
void test7(){
    OptionalDouble average = IntStream.rangeClosed(5, 20)
            .skip(5)  //跳过前5个数
            .limit(10)  //只截取流中10个数
            .average();  //求平均值
    if (average.isPresent()){
        System.out.println(average.getAsDouble());
    }
}

3、自定义类

student类

@AllArgsConstructor
@Data
public class Student {
    int age;
    String name;
}
List<Student> stu = new ArrayList<>();
{
    stu.add(new Student(12, "赵六"));
    stu.add(new Student(20, "王五"));
    stu.add(new Student(15, "张三"));
    stu.add(new Student(18, "李四"));
    stu.add(new Student(18, "李四"));
}
@Test
void test3(){
    //filter的过滤数据,并且实现多层过滤
    stu.stream().
            distinct().
            filter(t->t.getAge()>15).
            filter(student -> student.getName().startsWith("李")).
            forEach(System.out::println);
    stu.stream().
            distinct().
            filter(t->t.getAge()>15).
            map(Student::getName).  //把student类型转成string类型,并且只保留这个字段的值作为后续流的数据
            filter(s -> s.startsWith("李")).
            forEach(System.out::println);
}

map()函数源码
在这里插入图片描述
这是啥?是不是还是有点懵,再看一下Function这个接口就明白了。
Java的stream的流操作_第1张图片
不就是把T–>R类型吗。


常用的中间操作

  • map
  • filter
  • sorted
  • distinct

常用的终止操作

  • forEach
  • toArray
  • 聚合操作 min、max、average
  • collect

说一下自定义类的sorted函数

我们使用的包装类和string类型都是实现了Comparable接口,所以直接使用sorted排序即可。
难道我们在自定义类的时候也需要为了可以排序专门去实现Comparable这个接口吗?如果真的是这样的话,显然侵入性太强了。
那怎么实现排序呢?流的sorted的方法有个重载方法,专门就是搞这个的,而且比包装类和string的还好用,自定义的可以实现降序呦。

升序

stu.stream().sorted(Comparator.comparing(Student::getAge)).forEach(System.out::println);

降序

stu.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(System.out::println);

你可能感兴趣的:(Java)