ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Stream流

2020-10-08 09:01:25  阅读:197  来源: 互联网

标签:Stream stream ArrayList list add name


Stream流

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

对比:

package com.py.Stream;

import java.util.ArrayList;
import java.util.List;

public class DemoStreamFilter {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("霍元甲");
        list.add("张无忌");
        list.add("杨过");
        list.add("张文");
//      过滤获得一张开头的名字
        ArrayList<String> nlist = new ArrayList<>();
        for (String i :
                list) {
            if (i.startsWith("张")){
                nlist.add(i);
            }
        }

//      循环得到字符长度为3的名字
        for (String i :
                nlist) {

            if (i.length()==3){
                System.out.println(i);
            }
        }
    }
}

package com.py.Stream;

import java.util.ArrayList;

public class DemoStreamFilter01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("霍元甲");
        list.add("张无忌");
        list.add("杨过");
        list.add("张文");
        //      过滤获得一张开头的名字
        //      循环得到字符长度为3的名字
        //      遍历
        list.stream()
                .filter(name->name.startsWith("张"))
                .filter(name->name.length()==3)
                .forEach(naem-> System.out.println(naem));
    }
}

获取Stream流的方法

  • 所有的Collection集合(单列集合)都可以通过Strem方式获得流

    • java.util.Interface Collection

    ​ default Stream stream() 返回以此集合作为源的顺序 Stream 。

  • Stream接口的静态方法of可以获得数组对应的流

    • java.util.stream.Interface Stream

集合间的关系

实例

package com.py.Stream;

import java.util.*;
import java.util.stream.Stream;

public class DemoGetStream {
    public static void main(String[] args) {
        //把ArraryList转换为流
        ArrayList<String> list = new ArrayList<>();
        Stream<String> stream01 = list.stream();

        //将set转化为流
        Set<String> set = new HashSet<>();
        Stream<String> stream02 = set.stream();

        //Map转化为stream流
        Map<String,String> map = new HashMap<>();
            //将键转化为流
        Stream<String> stream03 = map.keySet().stream();
            //将值转化为流
        Stream<String> stream04 = map.values().stream();
            //获取键值对
        Stream<Map.Entry<String, String>> stream05 = map.entrySet().stream();


        //将数组转化为流
        Stream<Integer> stream06 = Stream.of(1, 2, 3, 4, 5, 6);
			//int类型
        Integer[] integer = {1,2,3,4,5,6};
        Stream<Integer> stream07 = Stream.of(integer);
			//String类型
        String [] str = {"ni","aef","zsdf","dsfg"};
        Stream<String> stream08 = Stream.of(str);


    }
}

常用方法

常用的方法分为两类:

  • 延迟方法:返回值仍然是Stream流接口的方法,支持链式调用
  • 终结方法: 返回值类型不再是stream流接口的方法,因此不再支持类似的链式调用

forEach

返回值 方法 描述
void forEach(Consumer<? super T> action) 对此流的每个元素执行操作。【接口方法】

Consumer 接口中包含抽象方法void accept(T t),消费一个指定泛型的数据。

​ T:流中的元素类型

Filter

返回值 方法 描述
Stream<T> filter(Predicate<? super T> predicate) 返回由与此给定谓词匹配的此流的元素组成的流。

Predicate:函数式接口,可以使用lambda表达式对数据进行过滤。

​ 抽象方法 test(T t)

Map

返回值 方法 描述
<R> Stream<R> map(Function<? super T,? extends R> mapper) 返回由给定函数应用于此流的元素的结果组成的流。【映射为其他类型】

Function:函数式接口,可以使用lambda表达式进行映射

​ 抽象方法:R apply (T);

Count

返回值 方法 描述
long count() 返回此流中的元素数。

此方法是一个终结方法,统计流中元素个数,调用后不能继续使用。

Limit

返回值 方法 描述
Stream<T> limit(long maxSize) 返回由此流的元素组成的流,截短长度不能超过 maxSize

截取前maxSize位的元素,组成一个新的流。

Skip

返回值 方法 描述
Stream<T> skip(long n) 在丢弃流的第一个 n元素后,返回由该流的 n元素组成的流。

丢弃前n个元素后,追成一个新的流。

Concat

返回值 方法 描述
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) 创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。

练习

package com.py.Stream;

import java.util.stream.Stream;

public class DemoStreamMethor {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("张三", "李四", "王五", "刘六", "田七");
//        filter(stream);
//        count(stream);
//        limit(stream);
//        skip(stream.skip(3));
    }

    private static void skip(Stream<String> skip) {
        skip
                .forEach(name -> {
                    System.out.println(name);
                });
    }

    private static void limit(Stream<String> stream) {
        skip(stream.limit(3));
    }

    private static void count(Stream<String> stream) {
        System.out.println(stream.count());
    }

    private static void filter(Stream<String> stream) {
        stream.filter((String name)->{ return name.startsWith("张");})
                .forEach((name->{System.out.println(name);}));
    }
}

实例

package com.py.Stream;

import java.util.ArrayList;
import java.util.stream.Stream;

public class DemoTest {
    public static void main(String[] args) {
        ArrayList<String> one = new ArrayList<>();
        one.add("迪丽热巴");
        one.add("宋远桥");
        one.add("迪丽热巴");
        one.add("苏星河");
        one.add("石破天");
        one.add("老子");

        Stream<String> oneStream = one.stream().filter(name -> {
            return name.length() == 3;
        }).limit(3);



        ArrayList<String > two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("赵丽颖女");
        two.add("张三丰");
        two.add("赵四");
        two.add("汪远");
        two.add("铃木爱理");

        Stream<String> twoStream = two.stream().filter(name -> {
            return name.length() == 4;
        }).skip(1);

        Stream.concat(oneStream,twoStream).map(name->{return new Person(name);}).forEach(p->{
            System.out.println(p);
        });

    }
}

标签:Stream,stream,ArrayList,list,add,name
来源: https://www.cnblogs.com/yuknight/p/13780274.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有