Java学习笔记——Stream流

一、Stream流的生成方式

1、collection集合可以用默认方法stream生成流。
如 ArrayList<String> list = new ArrayList<String>();
	list.stream().forEach();
2、Map集合间接生成
3、数组通过Stream接口的静态方法of(T... values)生成流。

二、Stream流的中间操作方法

1、Stream<T> filter​(Predicate<? super T> predicate) 返回由与此给定谓词匹配的此流的元素组成的流。  
2、Stream<T> limit​(long maxSize) 返回由此流的元素组成的流,截短长度不能超过 maxSize 。  
3、Stream<T> skip​(long n) 在丢弃流的第一个 n元素后,返回由该流的剩余元素组成的流。  
4、static <T> Stream<T> concat​(Stream<? extends T> a, Stream<? extends T> b) 创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。  
5、Stream<T> distinct​() 返回由该流的不同元素(根据 Object.equals(Object) )组成的流。 
6、Stream<T> sorted​() 返回由此流的元素组成的流,根据自然顺序排序。  
7、Stream<T> sorted​(Comparator<? super T> comparator) 返回由该流的元素组成的流,根据提供的 Comparator进行排序。  
8、IntStream mapToInt​(ToIntFunction<? super T> mapper) 返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。  

三、Stream流终结操作

1、void forEach​(Consumer<? super T> action) 对此流的每个元素执行操作。 
2、long count​() 返回此流中的元素数。  

四、举例说明

public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<String>();

        arr.add("张三");
        arr.add("林三");
        arr.add("张无忌");
        arr.add("张三丰");
        arr.add("杨玉环");

        //把集合中姓张的输出在控制台
        arr.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
        System.out.println("--------------");

        //把集合中长度为3的元素在控制台输出。
        arr.stream().filter(s -> s.length() == 3).forEach(System.out::println);
        System.out.println("--------------");

        //集合中姓张的且长度为3的元素在控制台输出
        arr.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);
        System.out.println("--------------");

        //取前三个元素输出
        arr.stream().limit(3).forEach(System.out::println);

        System.out.println("--------------");
        //跳过前三个元素
        arr.stream().skip(2).forEach(System.out::println);

        System.out.println("--------------");
        //跳过两个元素,然后输出剩下的前两个元素
        arr.stream().skip(2).limit(2).forEach(System.out::println);

        //需求1:取出前四个数据组成一个流
        Stream<String> stream = arr.stream().limit(4);

        //需求2:跳过前两个元素组成一个流
        Stream<String> stream1 = arr.stream().skip(2);

        //static <T> Stream<T> contat(Stream a, Stream b): 合并a和b为一个流
//        Stream.concat(stream, stream1).forEach(System.out::println);

        System.out.println("-----------");
        //Stream<T> distinct() 合并需求1和需求2得到的流。并把结果输出,要求字符串元素不能重复
        Stream.concat(stream,stream1).distinct().forEach(System.out::println);

        //一个流的 终结操作forEach只能出现一次。

        ArrayList<String> arrs = new ArrayList<String>();

        arrs.add("linqingxia");
        arrs.add("zhangsnafeng");
        arrs.add("anhaode");
        arrs.add("bolaiwen");
        arrs.add("kangyouwei");

        //按照字母顺序把数据输出在控制台
        arrs.stream().sorted().forEach(System.out::println);
        System.out.println("----------");

        //按照字符串长度把数据输出 //匿名内部类重写compare方法
        /*arrs.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int num = s1.length() - s2.length();
                int num1 = num == 0 ? s1.compareTo(s2) : num;
                return num1;
            }
        }).forEach(System.out::println);*/

        arrs.stream().sorted((s1, s2) -> {
            int num = s1.length() - s2.length();
            int num1 = num == 0 ? s1.compareTo(s2) : num;
            return num1;
        }).forEach(System.out::println);
        System.out.println("----------");
        //统计arr集合中以“张”开头的元素个数
        long count = arr.stream().filter(s -> s.startsWith("张")).count();
        System.out.println(count);
    }
运行结果:
张三
张无忌
张三丰
--------------
张无忌
张三丰
杨玉环
--------------
张无忌
张三丰
--------------
张三
林三
张无忌
--------------
张无忌
张三丰
杨玉环
--------------
张无忌
张三丰
-----------
张三
林三
张无忌
张三丰
杨玉环
anhaode
bolaiwen
kangyouwei
linqingxia
zhangsnafeng
----------
anhaode
bolaiwen
kangyouwei
linqingxia
zhangsnafeng
----------
3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值