两种获取Stream流的方式

两种获取Stream流的方式

  1. 两种获取Stream流的方式

    • Demo01GetStream

      package cn.xiaoge.day21.demo02;
      
      /*
          java.util.stream.Stream<T>是Java1.8新加入的最常用的流接口. (这并不是一个函数式接口)
          获取一个流非常简单, 有以下几种常用的方式:
              所有的Collection集合都可以通过stream默认方法获取流;
                  default Stream<E> stream​()	返回一个序列 Stream与此集合作为其来源。
              Stream接口的静态方法of可以获取数组对应的流.
                  static <T> Stream<T> of​(T... values)	返回其元素是指定值的顺序排序流。
                  参数是一个可变参数, 那么我们就可以传递一个数组
       */
      
      import java.util.*;
      import java.util.stream.Stream;
      
      public class Demo01GetStream {
      
          public static void main(String[] args) {
              // 把集合转换为Stream
              List<String> list = new ArrayList<>();
              Stream<String> stream1 = list.stream();
      
              Set<String> set = new HashSet<>();
              Stream<String> stream2 = set.stream();
      
              Map<String, String> map = new HashMap<>();
              // 获取键, 存到Set集合中
              Set<String> keySet = map.keySet();
              Stream<String> stream3 = keySet.stream();
      
              // 获取值, 存到一个Collection集合中
              Collection<String> values = map.values();
              Stream<String> stream4 = values.stream();
      
              Set<Map.Entry<String, String>> entries = map.entrySet();
              Stream<Map.Entry<String, String>> stream5 = entries.stream();
      
      
      
              // 把数组转换为Stream流
              Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);
      
              // 可变参数可以传递数组
              Integer[] arr = {1, 2, 3, 4, 5};
              Stream<Integer> stream7 = Stream.of(arr);
      
              String[] arr1 = {"1", "2", "3", "4", "5"};
              Stream<String> stream8 = Stream.of(arr1);
          }
      
      }
      
  2. Stream流中的常用方法_forEach

    • Demo02Stream_forEach

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_forEach
          void forEach(Consumer<? super T> action);
          该方法接受一个Consumer接口函数, 会将每一个流元素交给该函数进行处理
          Consumer接口是一个消费型的函数式接口, 可以传递Lambda表达式, 消费数据
      
          简单计:
              forEach方法, 用来遍历流中的数据
              是一个终结方法, 遍历之后就不能继续调用Stream中的其他方法
       */
      
      import java.util.stream.Stream;
      
      public class Demo02Stream_forEach {
      
          public static void main(String[] args) {
              // 获取一个Stream流
              Stream<String> stream = Stream.of("张三", "李四", "王五", "赵六", "田七");
      
              // 使用Stream流中的方法forEach对Stream流中的数据继续你行遍历
      /*
              stream.forEach((String name) -> {
                  System.out.println(name);
              });
      */
      
      
      
              // 优化Lambda表达式, 这里必须注释上面才能使用下面的这个, 因为forEach是终结方法
              stream.forEach(name-> System.out.println(name));
      
          }
      
      }
      
      
      // 运行结果
      张三
      李四
      王五
      赵六
      田七
      
  3. Stream流中的常用方法_filter

    • Demo03Stream_filter

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_forEach
          void forEach(Consumer<? super T> action);
          filter方法的参数Predicate是一个函数式接口, 所以可以传递Lambda表达式, 对数据进行过滤
          Predicate中的抽象方法:
              boolean test(T t);
       */
      
      import java.util.stream.Stream;
      
      public class Demo03Stream_filter {
      
          public static void main(String[] args) {
              // 创建一个Stream流
              Stream<String> stream = Stream.of("张无忌", "周芷若", "赵敏", "张强", "张三丰");
      
              // 对Stream流中的元素进行过滤, 只要行张的人
              /*Stream<String> stream2 = stream.filter((String name)->{
                 return name.startsWith("张");
              });*/
      
              // 优化Lambda表达式
              Stream<String> stream2 = stream.filter(name->name.startsWith("张"));
      
              // 遍历stream2流
              stream2.forEach(name-> System.out.println(name));
      
              /*
                  Stream流属于管道流, 只能消费(使用)一次
                  第一个Stream流调用完毕方法, 数据就会流转到下一个Stream上
                  而这时第一个Stream流已经使用完毕, 就会关闭
                  所以第一个Stream流就不能再调用方法了
               */
              // 遍历stream流  报错
              // stream.forEach(name-> System.out.println(name));  // java.lang.IllegalStateException
      
          }
      
      }
      
      
      // 运行结果
      张无忌
      张强
      张三丰
      
  4. Stream流中的常用方法_map

    • Demo04Stream_map

      package cn.xiaoge.day21.demo02;
      
      /*
          如果需要将流中的元素映射到另一个流中,可以使用 map 方法。
          <R> Stream<R> map(Function<? super T, ? extends R> mapper);
          该接口需要一个 Function 函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。
          Function中的抽象方法:
              R apply(T t);
      
       */
      
      import java.util.function.Function;
      import java.util.stream.Stream;
      
      public class Demo04Stream_map {
      
          public static void main(String[] args) {
              // 获取一个Stream类型的Stream流
              Stream<String> stream = Stream.of("1", "2", "3", "4", "5");
      
              // 使用map方法, 把字符串类型的整数, 转换(映射)为Integer类型的整数
              Stream<Integer> stream1 = stream.map(number -> Integer.parseInt(number));
      
              // 遍历stream1流
              stream1.forEach(number-> System.out.println(number.getClass() + "  " + number));
          }
      
      }
      
      
      // 运行结果
      class java.lang.Integer  1
      class java.lang.Integer  2
      class java.lang.Integer  3
      class java.lang.Integer  4
      class java.lang.Integer  5
      
  5. Stream流中的常用方法_count

    • Demo05Stream_count

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_count: 用于统计Stream流中的元素的个数
          long count();
          count方法是一个终结方法, 返回值是一个long类型的整数
          所以不能继续调用Stream流中的其他方法了
       */
      
      import java.util.ArrayList;
      
      public class Demo05Stream_count {
      
          public static void main(String[] args) {
              // 获取一个Stream流
              ArrayList<Integer> list = new ArrayList<>();
      
              // 添加元素
              list.add(1);
              list.add(2);
              list.add(3);
              list.add(4);
              list.add(5);
      
              long count = list.stream().count();
              System.out.println(count);
          }
      
      }
      
      
      // 运行结果
      5
      
  6. Stream流中的常用方法_limit

    • Demo06Stream_limit

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_limit: 用于截取流中的元素
          limit方法可以对流进行截取, 只取用前n个
          Stream<T> limit(long maxSize);
              参数是一个long型, 如果集合当前长度大于参数则进行截取; 否则不进行操作
      
          limit方法是一个延迟方法, 只是对流中的元素进行截取, 返回的是一个新的流, 所以可以继续调用Stream流中的其他方法
       */
      
      import java.util.stream.Stream;
      
      public class Demo06Stream_limit {
      
          public static void main(String[] args) {
              // 获取一个Stream流
              String[] arr = {"喜洋洋", "美羊羊", "懒洋洋", "灰太狼", "红太狼"};
              Stream<String> stream = Stream.of(arr);
      
              // limit(4)截取前四个元素, 返回新的流, 然后对新的流进行forEach遍历
              stream.limit(4).forEach(name-> System.out.println(name));
          }
      
      }
      
      
      // 运行结果
      喜洋洋
      美羊羊
      懒洋洋
      灰太狼
      
  7. Stream流中的常用方法_skip

    • Demo07Stream_skip

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_skip;用于跳过元素
          如果希望跳过前几个元素, 可以使用skip方法获取一个截取之后的新流;
          Stream<T> skip(long n);
              如果流的当前长度大于n, 则跳过前n个; 否则将会得到一个长度为0的空流
       */
      
      import java.util.stream.Stream;
      
      public class Demo07Stream_skip {
      
          public static void main(String[] args) {
              Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
      //        使用skip跳过3个元素
      //        Stream<Integer> stream2 = stream.skip(3); // 这里的3是3个元素, 不是下标
      //        stream2.forEach(number-> System.out.println(number)); // 4 5
      
              stream.skip(6).forEach(number-> System.out.println(number));  // 空流
          }
      
      }
      
      
      // 运行结果
      空的因为总共就5个元素
      
  8. Stream流中的常用方法_concat

    • Demo08Stream_concat

      package cn.xiaoge.day21.demo02;
      
      /*
          Stream流中的常用方法_concat: 用于把流组合到一起
          如果两个流, 希望合并成为一个流, 那么可以使用Stream接口的静态方法concat
          static <T> Stream<T> concat(Stream<? extends T>a, Stream<? extends T> b)
       */
      
      import java.util.stream.Stream;
      
      public class Demo08Stream_concat {
      
          public static void main(String[] args) {
              // 创建一个stream流
              Stream<String> stream = Stream.of("张无忌", "周芷若", "赵敏", "张强", "张三丰");
      
              // 创建一个stream2流
              Stream<String> stream2 = Stream.of("张三", "李四", "王五", "赵六", "田七");
      
              // concat把两个流合并成一个流
              Stream<String> stream3 = Stream.concat(stream, stream2);
              stream3.forEach(name-> System.out.println(name));
      
          }
      
      }
      
      
      // 运行结果
      张无忌
      周芷若
      赵敏
      张强
      张三丰
      张三
      李四
      王五
      赵六
      田七
      
  9. 集合元素的处理—传统方式&Stream方式

    • Person

      package cn.xiaoge.day21.demo03;
      
      public class Person {
      
          private String name;
      
          public Person() {
          }
      
          public Person(String name) {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          @Override
          public String toString() {
              return "Person{" +
                      "name='" + name + '\'' +
                      '}';
          }
      }
      
      
    • Demo01StreamTest

      package cn.xiaoge.day21.demo03;
      
      /*
        练习: 集合元素处理(传统方式)
              现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以 下若干操作步骤:
              1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
              2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
              3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
              4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
              5. 将两个队伍合并为一个队伍;存储到一个新集合中。
              6. 根据姓名创建 Person 对象;存储到一个新集合中。
              7. 打印整个队伍的Person对象信息。
       */
      
      import java.util.ArrayList;
      
      public class Demo01StreamTest {
      
          public static void main(String[] args) {
              // 现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以 下若干操作步骤:
              ArrayList<String> one = new ArrayList<>();
              one.add("迪丽热巴");
              one.add("宋远桥");
              one.add("苏星河");
              one.add("石破天");
              one.add("石中玉");
              one.add("老子");
              one.add("庄子");
              one.add("洪七公");
      
      
              ArrayList<String> two = new ArrayList<>();
              two.add("古力娜扎");
              two.add("张无忌");
              two.add("赵丽颖");
              two.add("张三丰");
              two.add("尼古拉斯赵四");
              two.add("张天爱");
              two.add("张二狗");
      
              // 1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
              ArrayList<String> three = new ArrayList<>();
              for (String s : one) {
                  if(s.length() == 3){
                      three.add(s);
                  }
              }
      
              for (String s : two) {
                  if(s.length() == 3){
                      three.add(s);
                  }
              }
      
              // 2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
              ArrayList<String> four = new ArrayList<>();
              for (int i = 0; i < three.size(); i++) {
                  if (i < 3) {
                      four.add(three.get(i));
                  }
              }
      
              // 3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
              ArrayList<String> five =  new ArrayList<>();
              for (String s : three) {
                  if(s.startsWith("张")){
                      five.add(s);
                  }
              }
      
              // 4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
              ArrayList<String> six =  new ArrayList<>();
              for (int i = 0; i < five.size(); i++) {
                  if(i < 2){
                      continue;
                  }
                  six.add(five.get(i));
              }
      
              // 5. 将两个队伍合并为一个队伍;存储到一个新集合中。
              ArrayList<String> seven =  new ArrayList<>();
              for (String s : four) {
                  seven.add(s);
              }
      
              for (String s : six) {
                  seven.add(s);
              }
      
              // 6. 根据姓名创建 Person 对象;存储到一个新集合中。
              ArrayList<Person> eight =  new ArrayList<>();
              for (String s : seven) {
                  Person p = new Person(s);
                  eight.add(p);
              }
      
              // 7. 打印整个队伍的Person对象信息。
              for (Person person : eight) {
                  System.out.println(person);
              }
          }
      
      }
      
      
      // 运行结果
      Person{name='宋远桥'}
      Person{name='苏星河'}
      Person{name='石破天'}
      Person{name='张天爱'}
      Person{name='张二狗'}
      
    • Demo02StreamTest

      package cn.xiaoge.day21.demo03;
      
      /*
        练习: 集合元素处理(传统方式)
              现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以 下若干操作步骤:
              1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
              2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
              3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
              4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
              5. 将两个队伍合并为一个队伍;存储到一个新集合中。
              6. 根据姓名创建 Person 对象;存储到一个新集合中。
              7. 打印整个队伍的Person对象信息。
       */
      
      import java.util.ArrayList;
      import java.util.stream.Stream;
      
      public class Demo02StreamTest {
      
          public static void main(String[] args) {
              // 现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以 下若干操作步骤:
              ArrayList<String> one = new ArrayList<>();
              one.add("迪丽热巴");
              one.add("宋远桥");
              one.add("苏星河");
              one.add("石破天");
              one.add("石中玉");
              one.add("老子");
              one.add("庄子");
              one.add("洪七公");
      
      
              ArrayList<String> two = new ArrayList<>();
              two.add("古力娜扎");
              two.add("张无忌");
              two.add("赵丽颖");
              two.add("张三丰");
              two.add("尼古拉斯赵四");
              two.add("张天爱");
              two.add("张二狗");
      
              // 1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
              // 2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
              Stream<String> stream1 = Stream.concat(one.stream().filter(name -> name.length() == 3), two.stream().filter(name -> name.length() == 3)).limit(3);
      
              // 3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
              // 4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
              Stream<String> stream2 = Stream.concat(one.stream().filter(name->name.startsWith("张")), two.stream().filter(name->name.startsWith("张"))).skip(2);
      
              // 5. 将两个队伍合并为一个队伍;存储到一个新集合中。
              Stream<String> stream3 = Stream.concat(stream1, stream2);
      
              // 6. 根据姓名创建 Person 对象;存储到一个新集合中。
              // 7. 打印整个队伍的Person对象信息。
              stream3.forEach(name-> System.out.println(new Person(name)));
      
          }
      
      }
      
      
      // 运行结果
      Person{name='宋远桥'}
      Person{name='苏星河'}
      Person{name='石破天'}
      Person{name='张天爱'}
      Person{name='张二狗'}
      
发布了285 篇原创文章 · 获赞 90 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/104029682