java基础教程——Stream流
创始人
2024-05-29 14:28:23
0

一、流的操作

  • 生成流的操作

通过数据源(集合、数组等)生成流

如,list.stream()

  • 中间操作

一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用

如,filter(),其操作完成之后还是一个stream流

  • 终结操作

一个流只能有一个终结操作,当这个操作执行后,流就被使用"光"了,无法再被操作。所以这必定是流的最后一个操作forEach()

forEach()

二、Stream流的生成方式

Stream流常见的生成方式有三种

  • Colletion体系的集合可以使用默认方法stream()生成流

default Stream stream()

List list = new ArrayList<>();
Stream listStream = list.stream();Set set = new HashSet<>();
Stream setStream = set.stream();

  • Map体系的集合间接的生成流

        Map map = new HashMap<>();//      这就是间接的获取键的stream流:map.keySet() 得到键的set集合,再通过键的set集合获取到流,Stream keyStream = map.keySet().stream();//      间接的获取值的stream流Stream valueStream = map.values().stream();//      键值对对象所对应的流Stream> entryStream = map.entrySet().stream();

  • 数组可以通过Stream接口的静态方法of(T...values)生成流

        String[] strArray = {"hello","world","java"};Stream strArrayStream = Stream.of(strArray);Stream strArrayStream2 = Stream.of("hello", "world", "java");Stream intStream = Stream.of(10, 20, 30);

三、Stream流常见中间操作方法

3.1 中间操作之filter(Predicate predicate)

  • Stream filter(Predicate predicate):用于对流中的数据进行过滤

Predicate接口中的方法 boolean test(T t) : 对给定的参数进行判断,返回一个布尔值

需求:把list集合中以张开头的元素在控制台输出

        ArrayList list = new ArrayList<>();list.add("林青霞");list.add("张曼玉");list.add("王祖贤");list.add("柳岩");list.add("张敏");list.add("张无忌");//      需求:把list集合中以张开头的元素在控制台输出//      filter()需要一个函数式接口,在这里我们可以写一个lambda表达式list.stream().filter( (String s) ->{return s.startsWith("张");} ).forEach(System.out::println);

其中我们的lambda表达式可以简写成下面的形式

list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);

需求:把list集合中长度为3的元素在控制台输出

  list.stream().filter(s->s.length()==3).forEach(System.out::println);

需求: 把list集合中以张开头的,长度为3的元素在控制台输出

 list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(System.out::println);

3.2 中间操作之limit&skip

  • Stream limit(long maxSize):返回流中的元素组成的流,截取前指定参数个数的数据

  • Stream skip(long n): 跳过指定参数个数的数据,返回由该流的剩余元素组成的流

需求:取前3个数据在控制台输出

 list.stream().limit(3).forEach(System.out::println);

需求:跳过3个元素,把剩下的元素在控制台输出

 list.stream().skip(3).forEach(System.out::println);

需求:跳过2个元素,把剩下的元素中前两个在控制台输出

        list.stream().skip(2).limit(2).forEach(System.out::println);

3.3 中间操作之concat&distinct()

  • static Stream concat(Stream a,Stream b):合并a和b两个流为一个流(静态方法)

  • Stream distinct():返回由该流的不同元素(根据Object.equals(Object))组成的流

需求:取前四个数据组成一个流

 Stream s1 = list.stream().limit(4);

需求:跳过2个数据组成一个流

Stream s2 = list.stream().skip(2);

需求: 合并需求1和需求2得到的流,并把结果在控制台输出

Stream.concat(s1, s2).forEach(System.out::println);

需求: 合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复

 Stream.concat(s1,s2).distinct().forEach(System.out::println);

3.4 中间操作之sorted

  • Stream sorted:返回由此流的元素组成的流,根据自然顺序排序

  • Stream sorted(Compatator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序

需求:按照字母顺序把数据在控制台输出

        ArrayList list = new ArrayList<>();list.add("linqingxia");list.add("zhangmanyu");list.add("wangzuxian");list.add("liuyan");list.add("zhangmin");list.add("zhangwuji");list.stream().sorted().forEach(System.out::println);

需求:按照字符串长度把数据在控制台输出

       list.stream().sorted((s1,s2)->{int num = s1.length()-s2.length();int num2 = num ==0 ? s1.compareTo(s2) : num;return  num2;}).forEach(System.out::println);

3.5 中间操作之map&mapToInt

  • Stream map(Fucntion mapper):返回由给定函数应用于此流的元素的结果组成的流

Function接口中的方法 R apply(T t)

  • IntStream map ToInt(ToIntFuction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果

IntStream:表示原始int流

ToIntUFunction接口中的方法 int applyAsInt(T value)

需求: 将集合中的字符串数据转换为整数之后再控制台输出

        ArrayList list = new ArrayList<>();list.add("10");list.add("20");list.add("30");list.add("40");list.add("50");list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);

或者

list.stream().map(Integer::parseInt).forEach(System.out::println);

或者 mapToInt也可以

 list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);

结果:

IntStream也是一个接口,支持顺序和并行聚合操作的原始int值元素序列,其有个方法是 int sum() 返回流中元素的总和

注意:sum方法是IntStream接口中的,而Stream接口中是没有的

        int sum = list.stream().mapToInt(Integer::parseInt).sum();System.out.println(sum);

四、Stream流常见终结操作方法

  • void forEach(Consumer action):对此流的每个元素执行操作

Consumer接口中的方法 void accept(T t): 对给定的参数执行此操作

我们前面指定的就是再控制台输出我们的数据

  • long count():返回此流中元素数

需求:把集合中的元素在控制台输出

        ArrayList list = new ArrayList<>();list.add("林青霞");list.add("张曼玉");list.add("王祖贤");list.add("柳岩");list.add("张敏");list.add("张无忌");list.stream().forEach(System.out::println);

需求: 统计集合中有几个以张开头的元素,并把统计结果输出

        long count = list.stream().filter(s -> s.startsWith("张")).count();System.out.println(count);

五、Stream流的练习

public class Actor {private String name;public Actor(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
        ArrayList manList = new ArrayList<>();manList.add("周润发");manList.add("成龙");manList.add("刘德华");manList.add("吴京");manList.add("周星驰");manList.add("李连杰");ArrayList womanList = new ArrayList<>();womanList.add("林心如");womanList.add("张曼玉");womanList.add("林青霞");womanList.add("柳岩");womanList.add("林志玲");womanList.add("王祖贤");

现在有两个ArrayList集合,分别存储6名男演员和6名女演员名称,要求完成如下的操作

  • 男演员只要名字为3个字的前三人

        Stream manStream = manList.stream().filter(s -> s.length() == 3).limit(3);

  • 女演员只要姓林的,并且不要第一个

 Stream womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);

  • 把过滤后的男演员姓名和女演员姓名合并到一起

Stream stream = Stream.concat(manStream, womanStream);

  • 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

演员类Actor已经提供,里面有一个成员变量,一个带构造方法,以及成员变量对应的get/set方法

 stream.map(Actor::new).forEach(System.out::println);

我们没有重写toString方法

stream.map(Actor::new).forEach( p-> System.out.println(p.getName()));

六、Stream流的收集操作

对数据使用stream流的方式操作完毕后,想把流中的数据收集到集合中

Stream流的收集方法

  • R collect(Collector collector)

R collect(Collector collector)

其中Collector是一个接口

Collectors是一个工具类,实现各种有用的还原操作的Collector,例如将元素累积到集合中,根据各种标准汇总元素等

工具类Collectors提供了具体的收集方式

  • public static Collector toList(): 把元素收集到List集合中

        ArrayList list = new ArrayList<>();list.add("林青霞");list.add("张曼玉");list.add("王祖贤");list.add("柳岩");list.add("张敏");list.add("张无忌");//        需求1:得到名字为3个字的流Stream listStream = list.stream().filter(s -> s.length() == 3);//        需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历List names = listStream.collect(Collectors.toList());for(String name :names){System.out.println(name);}}

  • public static Collector toSet(): 把元素收集到Set集合中

        Set set = new HashSet<>();set.add(10);set.add(20);set.add(30);set.add(33);set.add(35);
//      需求: 大于25Stream setStream = set.stream().filter(are -> are > 25);
//      需求:把使用Stream流操作完毕的数据收集到Set集合中并遍历Set ages = setStream.collect(Collectors.toSet());for(Integer age :ages)System.out.println(age);

  • public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中

       String[] strArray = {"林青霞,30","张曼玉,35","王祖贤,33","柳岩,25"};
//     需求:得到字符串中年龄数据大于28的流Stream arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);//     需求:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作为键,年龄作为值Map map = arrayStream.collect(Collectors.toMap( s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]) ) );Set keySet = map.keySet();for(String key: keySet){System.out.println(key+","+map.get(key));}

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...