Lamda的深入认知(七)

主题:流的操作

一、建立:

  1. 数组创建:
        //由数组生成流
        String[] array=new String[]{"a","b","c"};
        Stream stream1=Arrays.stream(array);
  1. Collection创建
        //由集合生成的流
        Collection collection=new ArrayList<>();
        Stream stream2=collection.stream();
  1. 函数创建
       //由函数生成的无限流
        Stream stream3=Stream.iterate(Double.valueOf(10),m->Math.random()*m);
        Stream stream4= Stream.generate(()->Math.random());
  1. 文件创建:
        //由文件生成流
        try(Stream stream5=Files.lines(Paths.get("abc.txt"), Charset.defaultCharset())){
            stream5.forEach(s-> System.out.println(s));
        }catch (IOException e){ }

二、 筛选:

  1. 原型:中间操作
Stream filter(Predicate predicate);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .filter(i->i>5);

三、 切片:

  1. 原型:中间操作
    Stream skip(long n);
    Stream limit(long maxSize);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .skip(1)
                .limit(2);

四、映射:

* 普通映射
  1. 原型:
 Stream map(Function mapper);
  1. demo:
        Arrays.asList(3,9,1,8)
                .stream()
                .map(i->"string:"+i);
* 扁平化映射:
  1. 原型:中间操作
 Stream flatMap(Function> mapper);

说明:它的操作分为两个步骤

  • 第一步将流中每个元素转化成为stream(不可以转变成为“原始值Stream”)
  • 第二步:将上步得到的若干个Stream合并成为一个Stream
  1. demo: 把若干个字符串遍历出来
  • 一次性转化方案
        Arrays.asList("abc","bcd")
                .stream()
                .flatMap(s->Arrays.stream(s.split("")))
                .forEach(s-> System.out.println(s));
  • 两步转化方案
        Arrays.asList("abc","bcd")
                .stream()
                .map(s->s.split(""))
                .flatMap(ary->Arrays.stream(ary))
                .forEach(s-> System.out.println(s));

五、查找、匹配、统计、遍历

  1. 原型:终端操作
Optional findFirst();
Optional findAny();
boolean noneMatch(Predicate predicate);
boolean allMatch(Predicate predicate);
boolean anyMatch(Predicate predicate);
long count();
void forEach(Consumer action);
void forEachOrdered(Consumer action);

六、reduce操作:

  1. 原型:终端操作
T reduce(T identity, BinaryOperator accumulator);
Optional reduce(BinaryOperator accumulator);
  U reduce(U identity,
                 BiFunction accumulator,
                 BinaryOperator combiner);
  1. demo:
        //求和
        int m=Arrays.asList(4,1,3,9,8)
                .stream()
                .reduce(0,(prev,current)->prev+current);

        //考虑到stream为空的情况
        int m1=Arrays.asList(4,1,3,9,8)
                .stream()
                .reduce((prev,current)->prev+current)
                .get();
        //类型转换操作后的求和
        Integer m2=Arrays.asList("4","1","7","9","8")
                .stream()
                .reduce(Integer.valueOf(0),(prev,current)->prev+Integer.valueOf(current),(a,b)->0);

七、排序

  1. 原型:
Stream sorted();
Stream sorted(Comparator comparator);
  1. demo:
    略...

你可能感兴趣的:(Lamda的深入认知(七))