lambda表达式之Stream API

关于Stream流的操作,还有一小部分程序员只停留在IO阶段。因为该笔记时关于lambda表达式介绍的,所以不记录IO部分内容。
在日常开发中关于数组和集合操作是必不可少的,而Stream正是处理关于数组和集合的API。


Stream特性

  • 不是数据结构,没有内部存储
  • 不支持索引访问
  • 延迟计算
  • 支持并行
  • 很容易生成数组或集合(List,Set)
  • 支持过滤,查找,转换,汇总,聚合等操作

Stream运行机制

  • Stream分为源,中间操作,终止操作。
  • 流的源可以是一个数组,一个集合,一个生成器方法。
  • 一个流可以有零个或多个中间操作,没有一个中间操作都会返回一个新的流,供下一个操作使用。
  • 一个流只有一个终止操作。
  • 只有当流遇到终止操作时,它的源才开始执行遍历操作,这就是为什么说Stream有延迟计算的特性。

Stream的创建

通过数组
通过集合
通过Stream.generate方法来创建
通过Stream.iterate方法来创建
通过其它API创建

package com.per.lambada;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest {
    // 创建数组格式的流
    static void setArr1() {
        String arr[] = { "a", "b", "c", "d" };
        Stream stream = Stream.of(arr);
    }
    // 创建List集合格式的流
    static void setArr2() {
        List list = Arrays.asList("a", "b", "c", "d");
        Stream stream = list.stream();
    }
    // 用generate创建(Supplier没输入有输出)
    static void setArr3() {
        Stream stream = Stream.generate(() -> 1);
    }
    // 用iterate创建(UnaryOperator有输入有输出)
    static void setArr4() {
        Stream stream = Stream.iterate(1, x -> x + 1);
    }
}

流的中间操作

过滤filter
去重distinct
排序sorted
截取limit、skip
转换map、flatMap
其他peek

流的终止操作

循环forEach
计算min、max、count、average
匹配anyMatch、allMatch、noneMatch、findFirst、findAny
汇聚reduce
收集器toArray、collect

package com.per.lambada;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest {
    public static void main(String[] args) {
        //中间操作:filter;终止操作:forEach
        Arrays.asList(1,2,3,4,5,6,7).stream().filter(x->x%2==0).forEach(System.out::println);
        
        //中间操作:filter,mapToInt;终止操作:sum
        int sum = Arrays.asList(1,2,3,4,5,6,7).stream().filter(x->x%2==0).mapToInt(x->x).sum();
        System.out.println("sum:"+sum);
        
        //中间操作:max;终止操作:get
        int max = Arrays.asList(1,2,3,4,5,6,7).stream().max((a,b)->a-b).get();
        System.out.println("max:"+max);
        
        //中间操作:min;终止操作:get
        int min = Arrays.asList(1,2,3,4,5,6,7).stream().min((a,b)->a-b).get();
        System.out.println("min:"+min);
        
        Optional op = Arrays.asList(1,2,3,4,5,6,7).stream().filter(x->x%2==0).findAny();
        System.out.println("查找任意元素"+op.get());
        
        int first=Arrays.asList(12,21,13,44,5,6,27).stream().sorted((a,b)->b-a).findFirst().get();
        System.out.println("由大到小排序后第一个元素是"+first);
        
        Object obj=Arrays.asList("ab","c","defg","hij","klm","n","opqrs").stream().sorted((a,b)->b.length()-a.length());
        System.out.println((String)obj.toString());
        
        // 将1-50放进list集合中
        List li = Stream.iterate(1, x->x+1).limit(50).collect(Collectors.toList());
        
        Object[] a=Arrays.asList(1,2,3,4,5,6,7,8,2,3,4,5).stream().distinct().toArray();
        
        // 去重可以使用distinct或使用Set集合的特性实现
        Set set=Arrays.asList(2,3,4,5,6,7,8,2,3,4,5,1).stream().collect(Collectors.toSet());
        System.out.println(set);
        
        String str ="11,22,33,44,55";
        int num =Stream.of(str.split(",")).mapToInt(x->Integer.valueOf(x)).sum();
        System.out.println(num);
    }
}

你可能感兴趣的:(lambda表达式之Stream API)