java学习之stream


Stream流是 JDK1.8新特性,对集合的元素进行过滤,筛选等一些操作

对list集合中的元素进行两次过滤只需要元素以张开头的并且长度为2最后遍历集合

 list.stream()
         .filter(name->name.startsWith("张"))
         .filter(name -> name.length()==2)
         .forEach(name -> System.out.println(name));

stream流的获取方式

根据Collection获取流(所有collection集合都可以通过stream默认方法获取流)

List<String> list1 = new ArrayList<>();
Stream<String> stream = list1.stream();

stream接口的静态方法of可以获取数组对应的流(of方法的参数为可变参数)

 Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);

stream流的常用方法

1.延迟方法:返回值类型依然是strean接口自身类型的方法,因此支持链式调用

  • filter()方法,该方法接收一个Predicate函数接口,因此可以使用lamdba表达式或方法引用

Stream filter(Predicate<? super T> predicate);

        //先用stream接口的of方法获取流
        Stream<String> stringStream = Stream.of("sada", "shjd", "adad", "lkda");
         //过滤掉不是s开头的字符串
        stringStream.filter(s -> s.startsWith("s"))
                .forEach(System.out::println);
  • map()方法,如果需要将流中的元素映射到另一个流中,可以使用map方法,该方法接收一个Function函数接口,因此可以使用lamdba表达式或方法引用

Stream map(Function<? super T, ? extends R> mapper);

        //先用stream接口的of方法获取流
        Stream<String> stringStream = Stream.of("1111", "2222", "3333", "4444");
        //再调用stream接口的map方法
        Stream<Integer> integerStream1 = stringStream.map(Integer::parseInt);
  • limit()方法,可以对流进行截取,只要前n个,该方法接收一个long类型的值

Stream limit(long maxSize);

        //先用stream接口的of方法获取流
        Stream<String> stringStream1 = Stream.of("1111", "2222", "3333", "4444");
        //再调用stream接口的limit方法
        Stream<String> limit = stringStream1.limit(2);
  • skip()方法,可以跳过前n个元素,如果流的当前长度大于n,则跳过前n个,反之会得到一个长度为0的空流,该方法接收一个long类型的值

Stream skip(long n);

        //先用stream接口的of方法获取流
        Stream<String> stringStream2 = Stream.of("1111", "2222", "3333", "4444");
        //再调用stream接口的skip方法
        stringStream2.skip(2)
                .forEach(System.out::println);
  • concat()静态方法,可以将两个流合并成一个流,该方法接收两个stream流

public static Stream concat(Stream<? extends T> a, Stream<? extends T> b)

        //先用stream接口的of方法获取流
        Stream<String> stringStream3 = Stream.of("1111", "2222", "3333", "4444");
        //再用stream接口的of方法获取流
        Stream<String> stringStream4 = Stream.of("1111", "2222", "3333", "4444");
        //再调用stream接口的concat静态方法
        Stream.concat(stringStream4,stringStream3)
                .forEach(System.out::println);

2.终结方法:返回值类型不是Stream接口自身类型的方法,因此不支持链式调用

  • forEach()方法,该方法接收一个Consumer函数接口,因此可用lambda表达式或方法引用

void forEach(Consumer<? super T> action);

        //先用stream接口的of方法获取流
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);
        //再调用stream接口的forEach方法进行遍历输出
        integerStream.forEach(System.out::println);
  • count()方法,获取流中元素个数,该方法返回一个long值

long count();

        //先用stream接口的of方法获取流
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);
        //再调用stream接口的count方法
        long count = integerStream .count();

stream流的特点

Stream流属于管道流,所以只能使用一次,当一个stream流调用完一个方法时就关闭了,数据会到下一个流身上。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值