Stream流的特点:
- Stream自己不会储存元素。
- Stream不会改变源对象,相反他们会返回一个持有结果的新Stream。
- Stream操作实延迟的,会等到需要结果时才执行。
Stream的使用步骤
- 创建流
- 添加中间操作
- 终止操作
创建流
public class Demo3 {
public static void main(String[] args) {
//创建流
// 1 通过Collection对象的stream()或parallelStream()方法。
ArrayList<String> list=new ArrayList<String>();
list.add("张三");
list.add("李瑞");
list.add("东冉");
list.add("楚俊");
list.add("赵六");
//串行流(单线程)
Stream<String> stream = list.stream();
//并行流(多线程,效率高)
Stream<String> parallelStream = list.parallelStream();
stream.forEach(System.out::println);
// 2 通过Arrays类的stream()方法。
IntStream stream2 = Arrays.stream(new int[] {10,8,100,20,50});
stream2.forEach(System.out::println);
//
// 3通过Stream接口的of()、iterate()、generate()方法。
System.out.println("----------3通过Stream接口的of()、iterate()、generate()方法。---------");
Stream<Integer> stream3 = Stream.of(100,200,300,400,500);
//iterate 迭代流 了解
// Stream<Integer> stream4=Stream.iterate(0, x->x+2);// 0 2 4 6 8 10 .....
// stream4.limit(10).forEach(System.out::println);
//
//generate() 生成流 了解
// Stream<Integer> stream5=Stream.generate(()->new Random().nextInt(100));
// stream5.limit(5).forEach(System.out::println);
//
// 4通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。
System.out.println("------ 4通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。-----");
IntStream intStream = IntStream.of(30,25,12,8,9);
intStream.forEach(System.out::println);
IntStream range = IntStream.rangeClosed(0, 100);
range.forEach(System.out::println);
}
}
添加中间操作
/**
*
* 中间操作:
* 1 filter、limit、skip、distinct、sorted
*
* 2 map
*
* 3 parallel
*
* @author wgy
*
*/
public class Demo4 {
public static void main(String[] args) {
// 1 filter、limit、skip、distinct、sorted
ArrayList<Employee> list = new ArrayList<Employee>();
list.add(new Employee("李瑞", 18, 20000));
list.add(new Employee("东冉", 20, 25000));
list.add(new Employee("楚俊", 20, 26000));
list.add(new Employee("云龙", 28, 50000));
list.add(new Employee("焦川", 22, 30000));
list.add(new Employee("焦川", 22, 30000));
// 1.1 filter 过滤
System.out.println("---- filter 过滤-----");
// 需求1 过滤年龄大于等于20
list.stream().filter(e -> e.getAge() >= 20).forEach(System.out::println);
System.out.println("-----");
// 需求2 过滤工资大于等于30000
list.stream().filter(e -> e.getSalary() >= 30000).forEach(System.out::println);
// 1.2 limit 限制
System.out.println("---- limit 限制-----");
list.stream().limit(2).forEach(System.out::println);
// 1.3 skip 跳过
System.out.println("---- skip 跳过-----");
list.stream().skip(2).limit(2).forEach(System.out::println);
// 1.4 distinct 去掉重复
System.out.println("---- distinct 去掉重复-----");
list.stream().distinct().forEach(System.out::println);
// 1.5sorted 排序
System.out.println("----sorted 排序-----");
list.stream().sorted((o1, o2) -> {
int n1 = o1.getAge() - o2.getAge();
int n2=Double.compare(o1.getSalary(), o2.getSalary());
return n1 == 0 ? n2 : n1;
}).forEach(System.out::println);
// 2 map 映射
System.out.println("------2 map---------");
list.stream()
.map(e->e.getSalary())
.forEach(System.out::println);
//3 parallel 并行流
list.stream()
.parallel()
.forEach(System.out::println);
}
}
终止操作
/**
* 终止操作:
forEach、min、max、count
reduce、collect
* @author wgy
*
*/
public class Demo7 {
public static void main(String[] args) {
ArrayList<Employee> list = new ArrayList<Employee>();
list.add(new Employee("李瑞", 18, 20000));
list.add(new Employee("东冉", 20, 25000));
list.add(new Employee("楚俊", 20, 26000));
list.add(new Employee("云龙", 28, 50000));
list.add(new Employee("焦川", 22, 30000));
list.add(new Employee("焦川", 22, 30000));
//1 forEach 遍历
//2 min 最小值 max最大值 count 统计数量
//Optional 防止NullPointerException的类
Optional<Employee> min=list.stream()
.min((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(min.get());
Optional<Employee> max=list.stream()
.max((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(max.get());
long count = list.stream().count();
System.out.println(count);
//3 reduce 归约
//计算所有人的工资的和
Optional<Double> sum=list.stream()
.map(e->e.getSalary())
.reduce((s1,s2)->s1+s2);
System.out.println(sum.get());
//4collect 收集
//获取所有人的工资的List集合
List<Double> salays = list.stream()
.map(e->e.getSalary())
.collect(Collectors.toList());
// Double avg = list.parallelStream()
// .map(e->e.getSalary())
// .collect(Collectors.averagingDouble(d->d));
//System.out.println(avg);
System.out.println("------collect 收集------");
for (Double d : salays) {
System.out.println(d);
}
}
}