Java8中Stream的篩選,切片與映射的用法
阿新 • • 發佈:2019-05-07
toc sts cti 使用 cte random shc for -- Java8中Stream的篩選,切片與映射的用法
使用Stream的三個操作步驟
- 創建Stream
- 中間操作
-
終止操作(終端操作)
@Test public void test1(){ //創建Stream //1.可以通過Collection系列集合提供的stream()獲取串行流或parallelStream()獲取並行流 List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); //2.通過Arrays中的靜態方法stream()獲取數組流 Employee[] emps = new Employee[10]; Stream<Employee> stream2 = Arrays.stream(emps); //3.通過Stream類中的靜態方法of() Stream<String> stream3 = Stream.of("aa", "bb", "cc"); //4.創建無限流 //通過叠代創建無限流 Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2); //中間操作和終止操作 stream4.limit(10).forEach(System.out::println); //通過生成隨機數創建無限流 Stream.generate(() -> Math.random()) .limit(5) .forEach(System.out::println); }
內部叠代與外部叠代
內部叠代:叠代操作由Stream API自己完成
外部叠代:由自己寫的程序完成//內部叠代:叠代操作由Stream API完成 @Test public void test1(){ //中間操作:不會執行任何操作 Stream<Employee> employeeStream = employees.stream() .filter((e) -> { System.out.println("Stream API的中間操作"); return e.getAge() > 35; }); //終止操作:一次性執行全部內容,即"惰性求值" employeeStream.forEach(System.out::println); } //外部叠代 @Test public void test2(){ Iterator<Employee> iterator = employees.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }
篩選與切片的用法
- filter---接收Lambda,從流中排除某些元素
- limit---截斷流,使其元素不超過給定的數量
- skip(n)---跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流,與limit(n)互補
-
distinct---篩選,通過流所生成元素的hashCode( )和equals( )去除重復元素
List<Employee> employees = Arrays.asList( new Employee("張三", 18 ,9999.99), new Employee("李四", 38, 5555.99), new Employee("王五", 50, 6666.66), new Employee("趙六", 16, 3333.33), new Employee("田七", 8, 7777.77), new Employee("田七", 8, 7777.77), new Employee("田七", 8, 7777.77) ); @Test public void test3(){ employees.stream() .filter((e) -> { System.out.println("短路"); return e.getSalary() > 5000; }) .limit(2) .forEach(System.out::println); } @Test public void test4(){ employees.stream() .filter((e) -> e.getSalary() > 5000) .skip(2) .forEach(System.out::println); } @Test public void test5(){ employees.stream() .filter((e) -> e.getSalary() > 5000) .skip(2) .distinct() .forEach(System.out::println); }
映射的用法
- map---接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數作為參數,該參數會被應用到每個元素上,並將其映射成一個新的元素。
-
flatMap---接收一個函數作為參數,將流中的每個值換成另一個流,然後把所有流連接成一個流
public static Stream<Character> filterCharacter(String str){ List<Character> list = new ArrayList<>(); for (Character ch : str.toCharArray()){ list.add(ch); } return list.stream(); } @Test public void test6(){ List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee"); list.stream() .map((str) -> str.toUpperCase()) .forEach(System.out::println); System.out.println("----------------------------"); employees.stream() .map(Employee::getName) .forEach(System.out::println); System.out.println("-----------------------------"); Stream<Stream<Character>> stream = list.stream() .map(TestStreamAPI2::filterCharacter);//{{a, a, a}, {b, b, b}} stream.forEach((sm) -> { sm.forEach(System.out::println); }); System.out.println("--------------------------------"); Stream<Character> sm = list.stream() .flatMap(TestStreamAPI2::filterCharacter);//{a, a, a, b, b, b} sm.forEach(System.out::println); }
Java8中Stream的篩選,切片與映射的用法