筛选与切片

filter 过滤

可以通过filter方法将一个流转换成另一个子集流。方法声明:

  1. Stream<T> filter(Predicate<? super T> predicate);

该接口接收一个Predicate函数式接口参数(可以是一个Lambda)作为筛选条件。

常见的使用方法如下:
比如我们现在需要过滤获得姓名开头是张的元素

  1. public class Demo16StreamFilter {
  2. public static void main(String[] args) {
  3. Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
  4. Stream<String> result = original.filter((String s) -> {return s.startsWith("张");});
  5. }
  6. }

limit 取用前几个

limit方法可以对流进行截取,只取用前面n个
如果集合当前长度大于参数则进行截取;否则不进行操作。基本使用:

  1. import java.util.stream.Stream;
  2. public class Demo18StreamLimit {
  3. public static void main(String[] args) {
  4. Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
  5. Stream<String> result = original.limit(2);
  6. System.out.println(result.count()); // 2
  7. }
  8. }

skip 跳过前几个

如果希望跳过前面几个元素,可以使用skip方法来获得一个截断之后的流
如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。基本使用:

  1. import java.util.stream.Stream;
  2. public class Demo19StreamSkip {
  3. public static void main(String[] args) {
  4. Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
  5. Stream<String> result = original.skip(2);
  6. System.out.println(result.count()); // 1
  7. }
  8. }

映射

映射主要涉及到的方法就是map
映射可以把当前流元素映射成一个新的元素
比如我们可以通过map把一个员工对象流映射成员工对象的姓名流
假设我们现在需要获得员工姓名长度大于3的员工姓名

  1. public class StreamApiTest {
  2. @Test
  3. public void streamApiTest(){
  4. List<String> strings = Arrays.asList("aa", "bb", "cc", "dd");
  5. Employ employ1 = new Employ(1, "yxr");
  6. Employ employ2 = new Employ(2, "zyl");
  7. Employ employ3 = new Employ(3, "zylara");
  8. Employ employ4 = new Employ(2, "yxr142748");
  9. List<Employ> list = Arrays.asList(employ1,employ2,employ3,employ4);
  10. list.stream()
  11. .map(Employ::getName)
  12. .filter(name -> name.length() > 3)
  13. .forEach(System.out::println);
  14. }
  15. }

image.png

又或者说,我们需要把一个字符串数组里面的所有字符串都转换成大写
image.png

排序

  1. sorted() 产生一个新流,其中按照自然排序排序
  2. sorted(Comparator comparator) 产生一个新流,其中按比较器规定的顺序排序

自然排序

假设我们需要对一个数组中的所有数字按照从小到大的顺序排序,那么我们可以直接调用自然排序方法

  1. @Test
  2. public void test4(){
  3. List<Integer> list = Arrays.asList(12, 141, 123125, 123, 526, 242);
  4. list.stream()
  5. .sorted()
  6. .forEach(System.out::println);
  7. }

image.png

比较器排序

有时候我们需要排序的对象并不像是只有数字这么简单,假设我们现在需要对员工进行排序,排序的规则是先按照年龄降序排序,如果年龄相同,那么就按照薪水的高低进行排序,显然这不是自然排序所能做到的,就需要我们人为的编写排序的比较器

Employ.java

  1. class Employ{
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. private Double salary;
  6. public Employ() {
  7. }
  8. public Employ(Integer id, String name, Integer age, Double salary) {
  9. this.id = id;
  10. this.name = name;
  11. this.age = age;
  12. this.salary = salary;
  13. }
  14. public Integer getId() {
  15. return id;
  16. }
  17. public void setId(Integer id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public Integer getAge() {
  27. return age;
  28. }
  29. public void setAge(Integer age) {
  30. this.age = age;
  31. }
  32. public Double getSalary() {
  33. return salary;
  34. }
  35. public void setSalary(Double salary) {
  36. this.salary = salary;
  37. }
  38. @Override
  39. public String toString() {
  40. return "Employ{" +
  41. "id=" + id +
  42. ", name='" + name + '\'' +
  43. ", age=" + age +
  44. ", salary=" + salary +
  45. '}';
  46. }
  47. }

image.png
image.png