Stream流

Stream流

  • java 8 中的流,其实就是Stream接口的对象

  • JDK提供了一个流接口:java.util.stream.Stream

  • 如何获取流

    1. 根据集合获取流:集合名.stream()
      ArrayList<String> list = new ArrayList<String>();
      Stream<String> streamA = list.stream();

    2. 根据数组获取流:Stream.of(数组名)
      String[] str = {"hello","word","java"};
      Stream<String> streamB = Stream.of(str);

  • 处理流的三种方法

    1. map(用于转换的Lambda表达式) 映射
      映射:就是将一个对象转换成另一个对象,把老对象映射到新对象上

      //转换成int类型
      ArrayList<String> list = new ArrayList<String>();
      list.add("100");
      list.add("200");
      list.add("300");
      list.add("400");
      //转换成int类型
      Stream<Integer> stream = list.stream().map(Integer::valueOf);
      
      
      ArrayList<String> list1 = new ArrayList<String>();
      list1.add("赵一,96");
      list1.add("钱二,91");
      list1.add("孙三,82");
      list1.add("李四,90");
      //切分并获取[0]号元素
      list.stream().map(str -> str.split(",")[0]);
      
      
    2. filter(能产生Boolean结果的Lambda表达式) 过滤(筛选)
      如果参数Lambda产生了true,则保留元素;如果产生了false,则丢弃元素

      ArrayList<Integer> list = new ArrayList<Integer>();
      list.add(100);
      list.add(200);
      list.add(30);
      list.add(40);
      
      //过滤出大于100的值
      list.stream().filter(i -> i > 100);
      
      ArrayList<String> list1 = new ArrayList<String>();
      list1.add("赵一");
      list1.add("钱二");
      list1.add("孙三");
      list1.add("李四");
      //过滤出李四
      list1.stream().filter(str -> str.equals("李四"));
      
    3. forEach(Lambda表达式) 遍历
      意思是对元素的每个元素都进行操作
      参数Lambda表达式必须是一个能够消费(使用)一个参数,且不产生结果(没有返回值)的lambda表达式(方法引用)
      例如:以下两个语句效果完全相同
      list.stream().forEach(str -> System.out.println(str)); //lambda表达式
      list.stream().forEach(System.out::println); //方法引用

      //遍历打印集合
      ArrayList<String> list = new ArrayList<String>();
      list.add("赵一");
      list.add("钱二");
      list.add("孙三");
      list.add("李四");
      list.stream().forEach(System.out::println);
      
  • Stream流综合联系

    ArrayList<String> list = new ArrayList<String>();
    list.add("赵一,96");
    list.add("钱二,91");
    list.add("孙三,82");
    list.add("李四,90");
    //输出大于等于90的成绩,输出结果必须是int类型
    list.stream().map(str -> str.split(",")[1]).map(Integer::parseInt).filter(i -> i >= 90).forEach(System.out::println);
    
  • 并发的Stream流

    • 流当中的元素如果特别多,那么只有一个人在逐一处理,比较慢

    • 如果对流中的元素多人同时处理,这就是并发

    • 获取并发流的方法

      1. 集合名.parallelStream()
      2. 集合名.stream().parallel()
      3. Stream.of(数组名).parallel()
    • 可以直接获取并发流,获取并发流的方法1;

    • 当已经获取了一个普通的流,调用parallel()方法也会变为并发流

    • 只要使用正确不会发生多个人抢到同一元素的情况

    public class StreamTestStreamParallel {
    
      public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ArrayList<String> list = new ArrayList<String>();
        for(int i = 0;i < 100;i++)
          list.add("HelloWord-"+i);
    
        //list.parallelStream().forEach(System.out::println);  //无序的,说明并发执行,获取方法1
    
        //list.stream().parallel().forEach(System.out::println);  //无序的,说明并发执行,获取方法2
    
        String[] str = new String[100];
        for(int i = 0;i < 100;i++)
          str[i] = "HelloWord-"+i;
      
        //Stream.of(str).parallel().forEach(System.out::println);  //无序的,说明并发执行,获取方法3
    
        Integer[] ints = new Integer[100];
        for(int i = 0;i < 100;i++)
          ints[i] = i+1;
        Stream.of(ints).parallel().forEach(System.out::println);
      
      }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值