Stream流常用方法

1.Stream流的常用方法:

      终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
      非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,concat
      方法名               方法的作用             方法的种类               是否支持链式调用
      count                 统计个数                     终结                               否
      foEach               逐一处理                     终结                               否
      filter                   过滤                         函数拼接                           是
      limit                   取用前几个              函数拼接                            是
      skip                   跳过前几个              函数拼接                            是
      map                      映射                     函数拼接                            是
      concat                   组合                    函数拼接                            是

2.count方法:

      long count();   统计流中的元素,返回long类型数据
public class Tests_count {
    public static void main(String[] args) {
        /*
        * count方法:
        *       long count();   统计流中的元素,返回long类型数据
        *
        * */
        // 创建List集合
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三四");
        list.add("王五");
        list.add("赵六");
        list.add("张三三");
        list.add("周八");
        long count = list.stream().count();
        System.out.println("流中的属于个数:"+count);
    }
}

3.forEach

forEach方法:
      void forEach(Consumer<? super T> action):逐一处理流中的元素
          参数 Consumer<? super T> action : 函数式接口, 只有一个抽象方法:void accept(T t);
      注意:
          1.此方法并不保证元素的逐一消费动作在流中是有序执行的
          2.Consumer 是一个消费接口(可以获取流中的元素进行遍历操作,输出出去),可以使用lambda表达式

public class Tests_forEach {
    public static void main(String[] args) {
    List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三四");
        list.add("王五");
        list.add("赵六");
        list.add("张三三");
        list.add("周八");
        // 函数模型:获取流 --> 逐一消费流中的元素
        list.stream().forEach((String name)->{
            System.out.println(name);
        });
        /*
        * 虽然方法名称叫做【forEach】,但是与for循环中的【for-each】昵称不同,该方法并不保证元素的逐一消费动作在流中是被有序执行的
        * */
        System.out.println("==========================");
        // parallelStream()方法可以得到并行流
        list.parallelStream().forEach((String name)->{
            System.out.println(name);
        });
    }
}

4.filter方法

      Stream<T> filter(Predicate<? super T> predicate);  过滤出满足条件的元素
          参数Predicate:函数式接口,抽象方法:boolean test(T t);
          Predicate接口:是一个判断接口

public class Tests_filter {
    public static void main(String[] args) {


        // 获取stream流
        Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
        // 需求:过滤处
        stream.filter((String name)->{
            return name.startsWith("张");
        }).forEach((String name)->{
            System.out.println(name);
        });
    }
}

5.limit方法

      Stream<T>
      注意:
      参数是一个long类型,如果流的但钱长度大于参数则进行截取;否则不进行操作

public class Tests_limit {
    public static void main(String[] args) {

        // 获取stream流
        Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
        // 需求:保留前3个元素
        stream.limit(3).forEach((String name) -> {
            System.out.println(name);
        });
        System.out.println("===========================");
        // 如果流的获取长度 大于 流当前的长度,则不操作

        stream.limit(10).forEach(name-> System.out.println(name)); // 异常: stream has already
                                                // been operated upon or closed 流已被操作或关闭

        Stream<String> stream1 = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
        stream1.limit(10).forEach(name-> System.out.println(name));
        
    }
}

6.skip方法:

      Stream<T> skip(long n);     跳过前几个元素
      注意:
          如果流的当前长度大于 n,则跳过前n个,否则将会得到一个长度为0的空流

public class Tests_skip {
    public static void main(String[] args) {

        // 获取stream流
        Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
        // 需求:跳过前3个
        stream.skip(3).forEach(name-> System.out.println(name));
    }
}

7.map方法

      <R> Stream<R> map(Function<? super T, ? extends R> mapper);
          参数 Function<T,R>:函数式接口,抽象方法: R apply(T t);
              Function<T,R>:其实就是一个类型转换接口(T和R的类型可以一致,也可以不一致)

public class Tests_map {
    public static void main(String[] args) {


        // 获取stream流
        Stream<String> stream1 = Stream.of("11", "22", "33", "44", "55");
        // 需求:把stream1流中的元素转换为int类型
        stream1.map((String s)-> Integer.parseInt(s)).forEach((Integer i)->System.out.println(i));

        // 需求:把stream2流中的元素转换为String类型
        Stream<String> stream2 = Stream.of("11", "22", "33", "44", "55");
        stream2.map((String s) ->
        {return s+"";   // 将流中的String类型的元素进行加工,拼接操作,返回String类型的元素的流
        }).forEach(s -> {
            System.out.println(s);});   // 将流中的String类型元素逐一输出

    }
}

8.concat方法

      public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
          --> 合并两个流

public class Tests_concat {
    public static void main(String[] args) {


        Stream<String> stream1 = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
        Stream<String> stream2 = Stream.of("11", "22", "33", "44", "55");
        // 需求:合并两个流
        Stream<String> concat = Stream.concat(stream1, stream2);
        concat.forEach(name-> System.out.println(name));
    }
}

9.收集Stream流

Stream流中提供了一个方法,可以把流中的数据手机到单列集合中:
      <R, A> R collect(Collector<? super T, A, R> collector);     把流中的数据手机到单列集合中
          返回值类型是R。R指定为什么类型,就是手机到什么类型的集合
          参数Collector<? super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中
          参数Collector如何得到 ?,可以使用 java.util.stream.Collectors工具类中的静态方法:
              - public static <T> Collector<T, ?, List<T>> toList():转换为List集合
              - public static <T> Collector<T, ?, Set<T>> toSet() :转换为Set集合

public class Tests {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三四");
        list.add("王五");
        list.add("赵六");
        list.add("张三三");
        list.add("周八");
        // 需求:过滤出姓张的并且长度为3的元素

        Stream<String> stream1 = list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3);

        // stream 收集到单列集合中
        List<String> list1 = stream1.collect(Collectors.toList());
        System.out.println(list1);

        // stream 手机到单列集合中
        Set<String> set1 = stream1.collect(Collectors.toSet());
        System.out.println(set1);
    }
}

Stream流中一个方法
      Object[] toArray(); 返回一个包含此流的元素的数组

public class Tests2 {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三四");
        list.add("王五");
        list.add("赵六");
        list.add("张三三");
        list.add("周八");
        Stream<String> stream = list.stream().filter(name -> name.length() == 3).filter(name -> name.startsWith("张"));
        // 将stream流中的元素转成Array数组对象
        Object[] arr = stream.toArray();
        System.out.println(Arrays.toString(arr));
    }
}

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值