Lambad,Stream的使用及其注意事项

1.Lambad表达式
(1)Lambad的作用:Lambda表达式的作用就是简化代码,省略了面向对象中类和方法的书写。
(2)Lambad的三个部分
-1- 一些参数
-2-一个箭头
-3-一段代码
标准格式

//(参数)->{一段代码}
(a)->{System.out.println(a)}

案例演示,利用线程打印1-100:

public class Test1_1 {
    public static void main(String[] args) {
        new Thread(() -> {
            for (int i = 1; i <= 100; i++) {
                System.out.println(i);
            }
        }).start();
    }
}	

(3)Lambda的前提条件
-1- 使用Lambda必须具有接口,且要求接口中的抽象方法有且仅有一个。(别的方法没有影响)

(4) 函数式接口
如果一个接口中只有一个抽象方法,那么这个接口叫做是函数式接口。
​ @FunctionalInterface这个注解 就表示这个接口是一个函数式接口。

2.Stream流
(1)概述

​ Stream用来解决之前集合的弊端。

​ Stream流相当于是流水线的操作,可以对一个集合进行多次操作

(2)collection集合转Stream
直接调用对象名.stream()方法

(3)Stream类型的常用方法

  • count(): 统计个数

    long count = stream.count();
    System.out.println(count);    //流中元素的个数 5
    
  • forEach() :逐一处理

    //打印流中的每个元素
    stream.forEach((String s)->{
                System.out.println(s);
            });
    
    //把Lambda简化之后的写法:
    stream.forEach(s->System.out.println(s));
    
  • 非终结方法:支持链式编程,可以继续调用流的其他方法。

    • filter() :过滤筛选

      如果返回值是true就留下这个元素 , 如果返回值是false就过滤掉这个元素

      //筛选留下所有姓张的人
      stream.filter((String s)->{return s.startsWith("张");}).
      										forEach(s->System.out.println(s));
      //把Lambda简化之后的写法:
      stream.filter(s->s.startsWith("张")).forEach(s->System.out.println(s));
      
    • limit(): 取用前几个

      //获取流的前三个元素
      stream.limit(3).forEach(s-> System.out.println(s));
      
    • skip(): 跳过前几个

      //跳过前三个元素获取剩余的元素
      stream.skip(3).forEach(s-> System.out.println(s));
      
    • map() : 映射方法(把元素进行转换)

      //把流中的元素换成字符串对应的长度(这就相当于是一个字符串和整数的映射)
      stream.map((String s)->{return s.length();}).forEach(s-> System.out.println(s));
      
      流中的字符串会变成整数: 3 3 2 3 2
      
    • concat() :组合(把两个流拼接成一个流)

      //筛选出姓张的人(过滤掉了不姓张的人)
      //张翠山 张无忌 张三丰  张三
      Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
      //筛选出姓名是三个字的人中的前两个人
      //张翠山 张无忌
      Stream<String> s2 = list.stream().filter(s -> s.length() == 3).limit(2);
      
      //concat() :拼接(静态方法可以使用类名调用)
      Stream<String> ss = Stream.concat(s1, s2);
      //打印
      ss.forEach(s-> System.out.println(s));
      
      //上面代码可以用链式编程简化成下面写法,不过不推荐写太长:
      Stream.concat(list.stream().filter(s -> s.startsWith("张")), list.stream().filter(s -> s.length() == 3).limit(2)).forEach(s-> System.out.println(s));
      

(4)Stream流转集合

  • 收集成List集合

    • collect(Collectors.toList());

      List<String> list = s1.collect(Collectors.toList());
      System.out.println("list" + list);
      
  • 收集成Set集合

    • collect(Collectors.toSet());

      Set<String> set = s1.collect(Collectors.toSet());
      System.out.println("set" + set);
      
  • 收集成数组

    • toArray(); 返回值是Object[]

      Object[] arr = s1.toArray();
      System.out.println(Arrays.toString(arr));
      
  • 收集到Map集合

    • collect(Collectors.toMap(键的内容,值的内容));

      //姓名作为键,姓名的长度作为值
      s1.collect(Collectors.toMap(s->s,s->s.length()));
      

**5.Stream类对象使用中需要注意的问题
一个Stream类对象只能被调用一次方法,否则会报错。列子如下:


public class Test1_2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "cab", "bac", "acb", "cba", "bca", "abc");
        Stream<String> stream = list.stream();
        stream.count(); //调用一次stream
        System.out.println(stream.count());//调用第二次stream 会报错!
    }
}

异常信息:
Exception in thread “main” java.lang.IllegalStateException: stream has already been operated upon or closed

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值