流(Stream)中保存對集合或數(shù)組數(shù)據(jù)的操作。和集合類似矫夯,但集合中保存的是數(shù)據(jù)。
Stream特點
1.Stream 自己不會存儲元素兼砖。
2.Stream不會改變源對象。相反,他們會返回一個持有結果的新Stream掖鱼。
3.Stream操作是延遲執(zhí)行的然走。這意味著他們會等到需要結果的時候才執(zhí)行。
Stream使用步驟
1.創(chuàng)建 :新建一個Stream
2.中間操作:在一個或多個步驟中戏挡,將初始Stream轉化到另一個Stream的中間操作芍瑞。
3.終止操作:使用一個終止操作來產(chǎn)生一個結果。該操作會強制它之前的延遲操作立即執(zhí)行褐墅。在這之后拆檬,該Stream就不能使用了。
創(chuàng)建Stream
1.通過Collection對象的stream()或parallelStream()方法妥凳。
2.通過Arrays類的stream()方法
3.通過Stream接口的of()竟贯、iterate()、generate()方法逝钥。
4.用過IntStream屑那、Long Stream、DoubleStream接口中的of艘款、range持际、rangeClosed方法。
package text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Stream的使用
* @author zdf
*/
public class Demo5Stream {
public static void main(String[] args) {
//1.通過Collection對象的stream()或parallelStream()方法哗咆。
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("huawei");
arrayList.add("xiaomi");
arrayList.add("pingguo");
Stream<String> stream = arrayList.stream();
//遍歷
// stream.forEach(s-> System.out.println(s));
stream.forEach(System.out::println);
// 2.Arrays工具類的Stream方法
String[] arr={"aaa","bbb","ccc"};
Stream<String> stream1 = Arrays.stream(arr);
stream1.forEach(System.out::println);
// 3.Stream接口中的of,iterate,generate方法
Stream<Integer> of = Stream.of(10,20,30,40);
of.forEach(System.out::println);
//迭代流
Stream<Integer> iterate = Stream.iterate(0, x -> x + 2);
iterate.limit(10).forEach(System.out::println);
// 生成流
Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100));
generate.limit(10).forEach(System.out::println);
// 4IntStream,LongStream,DoubleStream 的of,range,rangeClosed
IntStream intStream = IntStream.of(100, 200, 300);
intStream.forEach(System.out::println);
}
}
中間操作蜘欲、終止操作
中間操作
1.filter、limit晌柬、skip姥份、distinct、sorted
2.map
3.parallel q
package text;
import java.util.ArrayList;
import java.util.Comparator;
public class Demo6 {
public static void main(String[] args) {
ArrayList<Employee> list = new ArrayList<>();
list.add(new Employee("小王", (double) 15000));
list.add(new Employee("小李", (double) 20000));
list.add(new Employee("小張", (double) 18000));
list.add(new Employee("小孫", (double) 12000));
list.add(new Employee("小孫", (double) 12000));
// 中間操作1.filter 過濾 2.limit 限制 3. skip 跳過 4.distinct 去重 5. sorted 排序
//filter 過濾
list.stream().filter(e->e.getMoney()>(double)15000).forEach(System.out::println);
//limit 限制
list.stream().limit(2).forEach(System.out::println);
//skip跳過
list.stream().skip(2).forEach(System.out::println);
// distinct 去重復
list.stream().distinct().forEach(System.out::println);
// sorted 排序
list.stream().sorted(Comparator.comparingDouble(Employee::getMoney)).forEach(System.out::println);
// 中間操作2map
list.stream().map(e->e.getName()).forEach(System.out::println);
// 中間操作3 parallel 采用多線程效率
list.parallelStream().forEach(System.out::println);
}
}
終止操作
1.foreach年碘、 min澈歉、max、count
2.reduce屿衅、collect
package text;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class Demo8 {
public static void main(String[] args) {
ArrayList<Employee> list = new ArrayList<>();
list.add(new Employee("小王", (double) 15000));
list.add(new Employee("小李", (double) 20000));
list.add(new Employee("小張", (double) 18000));
list.add(new Employee("小孫", (double) 12000));
list.add(new Employee("小孫", (double) 12000));
//終止操作 foreach
list.stream().filter(e->e.getMoney()>15000).forEach(System.out::println);
//終止操作 min max count
Optional<Employee> min = list.stream().min(Comparator.comparingDouble(Employee::getMoney));
System.out.println(min.get());
//終止操作reduce 規(guī)約
//計算所有員工的工資和
Optional<Double> reduce = list.stream().map(Employee::getMoney).reduce((x, y) -> x + y);
System.out.println(reduce.get());
//終止方法collect收集
//獲取所有員工姓名埃难,封裝一個list集合
List<String> collect = list.stream().map(Employee::getName).collect(Collectors.toList());
for (String string : collect){
System.out.println(string);
}
}
}