A sequence of elements supporting sequential and parallel aggregate operationsjava
Stream是一組用來處理數組、集合的API
Java8之因此費這麼大功夫引入函數式編程,緣由有二:python
(1)代碼簡潔函數式編程寫出的代碼簡潔且意圖明確,使用stream接口讓你今後告別for循環
(2)多核友好,java函數式編程使得編寫並行程序從未如此簡單,你須要的所有就是調用一下parallel()方法
一、不是數據結構,沒有內部存儲
二、不支持索引訪問
三、延遲計算
四、支持並行
五、很容易生成數組或集合(List,Set)
六、支持過濾,查找,轉換;彙總,聚合等操做
一、Stream分爲 源source,中間操做,終止操做
二、流的源能夠是一個數組,一個集合,一個生成器方法,一個I/O通道等等
三、一個流能夠有零個或者多箇中間操做,每一箇中間操做都會返回一個新的流,供下一個操做使用,一個流只會有一個終止操做
四、Stream只有遇到終止操做,它的源纔開始執行遍歷操做
一、經過數組
二、經過集合
三、經過Stream.generate方法來建立
四、經過Stream.iterate方法來建立
五、其餘API建立
package com.msbline.stream; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; public class StreamDemo { //經過數組來生成 static void gen1(){ String[] args = {"a","b","c","d"}; Stream<String> stream = Stream.of(args); stream.forEach(System.out::println); } //經過集合來生成 static void gen2(){ List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); Stream<String> stream = list.stream(); stream.forEach(System.out::println); } //經過generate生成 static void gen3(){ Stream<Integer> stream = Stream.generate(() ->1); // stream.limit(3); stream.limit(3).forEach(System.out::println); } //使用iterator static void gen4(){ Stream<Integer> stream = Stream.iterate(1, x -> x + 1); stream.limit(10).forEach(System.out::println); } //其餘 static void gen5(){ String str = "abcdefg"; IntStream stream = str.chars(); stream.forEach(System.out::println); } public static void main(String[] args) { //生成操做 gen1(); System.out.println("gen2--------------------"); gen2(); System.out.println("gen3--------------------"); gen3(); System.out.println("gen4---------------------"); gen4(); System.out.println("gen5---------------------"); gen5(); } }
(1)過濾filter
(2)去重distinct
(3)排序sorted
(4)截取limit、skip
(5)轉換map/flatMap
(6)其餘peek
(1)循環forEach
(2)計算min、max、count、average
(3)匹配anyMatch、allMatch、noneMatch、findFirst、findAny
(4)匯聚reduce
(5)收集器toArray collect
public static void main(String[] args) { //中間操做:若是調用方法以後返回的結果是Stream對象就意味着是一箇中間操做 Arrays.asList(1,2,3,4,5).stream().filter((x)->x%2==0) .forEach(System.out::println); //求出結果集中全部偶數的和 int count = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9).stream().filter((x) -> x % 2 == 0) .mapToInt(x->x).sum(); System.out.println(count); //求集合中的最大值 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Optional<Integer> max = list.stream().max((a, b) -> a - b); System.out.println(max.get()); //求最小值 Optional<Integer> min = list.stream().min((a, b) -> a-b); System.out.println(min.get()); Optional<Integer> any = list.stream().filter(x -> x % 2 == 0).findAny(); System.out.println(any.get()); Optional<Integer> first = list.stream().filter(x -> x % 2 == 0).findFirst(); System.out.println(first.get()); List<Integer> list1 = Arrays.asList(1, 3, 5, 6); Stream<Integer> integerStream = list1.stream().filter(x -> { System.out.println("運行方法"); return x % 2 == 0; }); // System.out.println(integerStream.findFirst().get()); System.out.println(integerStream.findAny().get()); System.out.println("---------------------------------"); //獲取最大值和最小值,可是不使用min和max方法 List<Integer> list2 = Arrays.asList(1, 3, 5, 6); Optional<Integer> min1 = list2.stream().sorted().findFirst(); System.out.println(min1.get()); Optional<Integer> max1 = list2.stream().sorted((a, b) -> b - a).findFirst(); System.out.println(max1.get()); Arrays.asList("java","c#","python","scala").stream() .sorted().forEach(System.out::println); System.out.println("----------------------------------"); Arrays.asList("java","c#","python","scala").stream() .sorted((a,b)->a.length()-b.length()).forEach(System.out::println); //想將集合中的元素進行過濾同時返回一個集合 System.out.println("----------------------------------"); List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 5, 6); List<Integer> collect = list3.stream().filter(x -> x % 2 == 0).collect(Collectors.toList()); collect.forEach(System.out::println); System.out.println("-----------------------"); //去重操做 Arrays.asList(1,2,3,3,3,4,5).stream().distinct().forEach(System.out::println); System.out.println("-----------------------"); Arrays.asList(1,2,3,3,3,4,5).stream().collect(Collectors.toSet()).forEach(System.out::println); System.out.println("-----------------------"); //打印20-30這樣的集合數據 Stream.iterate(1,x->x+1).limit(50).skip(20).limit(10).forEach(System.out::println); System.out.println("------------------------"); String str = "11,22,33,44,55"; int sum = Stream.of(str.split(",")).mapToInt(x -> Integer.parseInt(x)).sum(); System.out.println(sum); int sum1 = Stream.of(str.split(",")).map(x -> Integer.valueOf(x)).mapToInt(x -> x).sum(); System.out.println(sum1); int sum2 = Stream.of(str.split(",")).mapToInt(Integer::valueOf).sum(); System.out.println(sum2); int sum3 = Stream.of(str.split(",")).map(Integer::valueOf).mapToInt(x -> x).sum(); System.out.println(sum3); System.out.println("-------------"); //建立一組自定義對象 String str2 = "java,scala,python"; Stream.of(str2.split(",")).map(x->new Person(x)).forEach(System.out::println); System.out.println("-------------"); Stream.of(str2.split(",")).map(Person::new).forEach(System.out::println); System.out.println("-------------"); Stream.of(str2.split(",")).map(x->Person.build(x)).forEach(System.out::println); System.out.println("-------------"); Stream.of(str2.split(",")).map(Person::build).forEach(System.out::println); System.out.println("-------------------"); //將每一個值都打印出來,同時算出最終的求和結果 String str1 = "11,22,33,44,55"; int sum4 = Stream.of(str1.split(",")).peek(System.out::println).mapToInt(Integer::valueOf).sum(); System.out.println(sum4); System.out.println(list.stream().allMatch(x -> x == 0)); System.out.println(list.stream().allMatch(x -> x >= 0)); System.out.println(list.stream().anyMatch(x -> x >= 0)); }