目錄
什么是Stream?
IO流:
Java8Stream:
什么是流?
stream圖解
獲取流
集合類,使用 Collection 接口下的 stream()
代碼
數組類,使用 Arrays 中的 stream() 方法
代碼
stream,使用 Stream 中的靜態方法
代碼
流操作
按步驟寫
代碼
鏈式調用
代碼
運行
中間操作:
?API
代碼?
運行
代碼?
運行
代碼
運行?
終端操作:
API
代碼
運行
代碼
運行
代碼
運行
代碼
運行
代碼
運行
代碼
運行
什么是Stream?
IO流:
輸入輸出文件的
Java8Stream:
處理數據集合(數組,集合類);
對數組,集合類 進行各種操作(過濾,排序......);
stream處理數據的大體過程:
數組/集合類-->流-->各種操作(排序,過濾...)-->結果。
什么是流?
數據和集合類更偏向于存儲數據(各種結構);
stream更偏向于數據操作。
stream圖解
獲取流
獲取流,把集合或者數組轉化為stream對象。
集合類,使用 Collection 接口下的 stream()
代碼
package com.ffyc.stream;import java.util.ArrayList;
import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);//把集合轉為流Stream<Integer> stream = arrayList.stream(); }
}
數組類,使用 Arrays 中的 stream() 方法
代碼
package com.ffyc.stream; import java.util.Arrays;
import java.util.stream.IntStream; public class Demo1 {public static void main(String[] args) { int[] array = new int[]{1,2,3,4};//把數組轉為流IntStream intStream = Arrays.stream(array); }
}
stream,使用 Stream 中的靜態方法
代碼
package com.ffyc.stream;import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) { Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);}
}
流操作
按步驟寫
代碼
package com.ffyc.stream;import java.util.Arrays;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,5};Stream<Integer> stream = Arrays.stream(array);Stream stream1 = stream.filter();Stream stream2 = stream1.sorted();}
}
鏈式調用
代碼
package com.ffyc.stream;import java.util.Arrays;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) { long sum = Arrays.stream(array).sorted().count();}
}
運行
中間操作:
流的各種數據處理
?API
filter:過濾流中的某些元素,
sorted(): 自然排序,流中元素需實現 Comparable 接口
distinct: 去除重復元素?
代碼?
package com.ffyc.stream;import java.util.Arrays; public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Arrays.stream(array).filter((e)->{return e<5;}).sorted((o1,o2)->{return o2-o1;}).distinct().forEach((e)->{System.out.println(e);});}
}
運行
limit(n): 獲取 n 個元素
skip(n): 跳過 n 元素,配合 limit(n)可實現分頁
代碼?
package com.ffyc.stream;import java.util.Arrays; public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Arrays.stream(array)//跳過指定數量個元素.skip(2)//取出指定數量個元素.limit(2).forEach((e)->{System.out.println(e);}); }
}
運行
map():將其映射成一個新的元素
代碼
package com.ffyc.stream;public class Student {private int num;private String name;private int age;public Student(int num, String name, int age) {this.num = num;this.name = name;this.age = age;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"num=" + num +", name='" + name + '\'' +", age=" + age +'}';}
}
package com.ffyc.stream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {Student s1 = new Student(001,"張三",18);Student s2 = new Student(002,"李四",19);Student s3 = new Student(003,"王五",29);Student s4 = new Student(004,"王麻子",21);Student s5 = new Student(005,"麗麗",19);ArrayList<Student> students = new ArrayList<>();students.add(s3);students.add(s1);students.add(s2);students.add(s5);students.add(s4); Object[] array = students.stream().map((Student::getNum))//將對象中某個屬性的值映射到一個新集合中.toArray();System.out.println(Arrays.toString(array));Map<Integer, String> map = students.stream().collect(Collectors.toMap(Student::getNum, Student::getName));System.out.println(map);}
}
運行?
終端操作:
把流轉為最終結果(數組/集合/單值)
API
Min:返回流中元素最小值
Max:返回流中元素最大值?
代碼
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5};Integer max = Arrays.stream(array).distinct().max((o1, o2) -> {//最大值return o1 - o2;}).get();System.out.println(max);Integer min = Arrays.stream(array).distinct().min((o1, o2) -> {//最小值return o1 - o2;}).get();System.out.println(min);
}
運行
count:返回流中元素的總個數
代碼
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; long count = Arrays.stream(array).distinct().count();//統計元素個數System.out.println(count); }
}
運行
Reduce:所有元素求和
代碼
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; /long reduce = Arrays.stream(array).distinct().reduce((a,b)->{//求和return a+b;}).get();System.out.println(reduce); }
}
運行
anyMatch:接收一個 Predicate 函數,只要流中有一個元素滿足條件則返回 true,否則返回 false
allMatch:接收一個 Predicate 函數,當流中每個元素都符合條件時才返回 true,否則返回 false
代碼
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Boolean result1 = Arrays.stream(array).distinct().anyMatch((e)->{//只有有一個元素滿足條件,返回truereturn e>2;});System.out.println(result1);Boolean result2 = Arrays.stream(array).distinct().allMatch((e)->{//所有的條件都滿足條件,返回truereturn e>2;});System.out.println(result2); }
}
運行
findFirst:返回流中第一個元素
代碼
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Integer result = Arrays.stream(array).distinct().findFirst().get();System.out.println(result);}
}
運行
collect:將流中的元素倒入一個集合,Collection 或 Map
代碼
package com.ffyc.stream;public class Student {private int num;private String name;private int age;public Student(int num, String name, int age) {this.num = num;this.name = name;this.age = age;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"num=" + num +", name='" + name + '\'' +", age=" + age +'}';}
}
package com.ffyc.stream;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {Student s1 = new Student(001,"張三",18);Student s2 = new Student(002,"李四",19);Student s3 = new Student(003,"王五",29);Student s4 = new Student(004,"王麻子",21);Student s5 = new Student(005,"麗麗",19);ArrayList<Student> students = new ArrayList<>();students.add(s3);students.add(s1);students.add(s2);students.add(s5);students.add(s4);List<Student> collect = students.stream().sorted((a,b)->{ //對學生對象集合進行排序,必須給定排序的規則return a.getNum()-b.getNum();}).collect(Collectors.toList());System.out.println(collect);List<Student> res = students.stream().filter((stu) -> {return stu.getAge()>18;}).collect(Collectors.toList());System.out.println(res);List<Integer> list = students.stream().map(Student::getNum).collect(Collectors.toList());System.out.println(list);}
}