- Stream 中间操作
多个中间操作可以连接起来形成一个 “流水线” ,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次全部处理,成为 “惰性求值”。
筛选与切片方法 |
描述 |
| filter(Predicate p) | 接收Lambda,从流中排除某些元素 |
| distinct() | 筛选,通过流所产生元素的 hashCode() 和 equals() 去除重复元素 |
| limit(long maxSize) | 截断流,使其元素不超过给定数量 |
| skip(long n) | 跳过元素,返回一个扔掉了前 n 个元素的流,若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补 |
映射方法 |
描述 |
| map(Funcation f) | 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 |
| mapToDouble(ToDoubleFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream |
| mapToInt(TolintFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream |
| mapToLong(ToLongFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream |
| flatMap(Function f) | 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流 |
排序方法 |
描述 |
| sorted() | 产生一个新流,其中按自然顺序排序 |
| sorted(Comparator com) | 产生一个新流,其中按比较器顺序排序 |
filter 用法
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //筛选出性别为男的同学信息 students.stream().filter(p-> '男' == p.getsex()).forEach(System.out::println); } }
distinct 用法 (去重复数据是通过流所生成元素的 hashCode() 和 equals() 所以实体类中需要生成对应的方法)
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //去掉重复的数据 students.stream().distinct().forEach(System.out::println); } }
limt 用法
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //展示前三个同学的信息 students.stream().limit(3).forEach(System.out::println); } }
skip 用法
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //显示除了前三个之外的学生信息 students.stream().skip(3).forEach(System.out::println); } }
map 用法
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //获取到男学生的姓名映射到新的集合中并打印 students.stream().filter(student -> '男'==student.getsex()).map(Student::getName).forEach(System.out::println); } }
- Stream 终止操作
终止操作 (终端操作) 从流水线生成结果。其结果可以是任何不是流的值,例如:List,Integer,甚至是 void。
流进行了终止操作后,不能再使用!
匹配与查找方法 |
描述 |
| allMatch(Predicate p) | 检查是否匹配所有元素 |
| anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
| noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
| findFirst() | 返回第一个元素 |
| findAny() | 返回当前流中的任意元素 |
| count() | 返回流中元素的总个数 |
| max(Comparator c) | 返回流中最大值 |
| min(Comparator c) | 返回流中最小值 |
| forEach(Consumer c) | 内部迭代 |
规约 方法 |
描述 |
| reduce(T iden,BlnaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 T |
| reduce(BlnaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 Optional < T > |
收集 方法 |
描述 |
| collect(Collector c) | 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法 |
allMatch 方法 (allMatch方法需要所有匹配才会返回true)
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //所有学生是不是都是男生 boolean rst = students.stream().allMatch(student -> '男' == student.getsex()); System.out.println(rst); } }
anyMatch 方法 (anyMatch方法只需要一个元素匹配就可以返回true)
public class LambdaTest { @Test public void test(){ List<Student> students = StudentData.getStudent(); //是否存在人妖 boolean rst = students.stream().anyMatch(student -> '妖' == student.getsex()); System.out.println(rst); } }
reduce 方法
public class LambdaTest { @Test public void test(){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //计算 1-10 的自然数的和 Integer sum = list.stream().reduce(0, Integer::sum); System.out.println(sum); } }
public class LambdaTest { @Test public void test(){ List<Student> students=StudentData.getStudent(); //学生id的总和 Optional<Integer> idSum = students.stream().map(Student::getId).reduce(Integer::sum); System.out.println(idSum); } }
collect 方法 (Collector 对象也有很多可选方法)
public class LambdaTest { @Test public void test(){ List<Student> students=StudentData.getStudent(); //查找性别为女的学生并返回一个 list集合 List<Student> list = students.stream().filter(student -> '女' == student.getsex()).collect(Collectors.toList()); System.out.println(list); } }
在此只演示个别的方法,小伙伴们私下可自行练习 (^ - ^) !










