zoukankan      html  css  js  c++  java
  • 47.Stream流

    1.体验Stream

        public static void main(String[] args) {
    //        1.传统实现方式
            ArrayList<String> list = new ArrayList<>();
            list.add("张无忌");
            list.add("张三丰");
            list.add("张曼玉");
            list.add("张飞");
            list.add("刘晓彤");
            list.add("闫云书");
            ArrayList<String> list1 = new ArrayList<>();
            ArrayList<String> list2 = new ArrayList<>();
            for (String s:list){
                if (s.startsWith("张")){
                    list1.add(s);
                }
            }
            for (String s:list1){
                if (s.length()>2){
                    list2.add(s);
                }
            }
            for (String s:list2){
                System.out.println(s);
            }
            System.out.println("---------------------------");
    //        2.Stream改进
            list.stream().filter(s->s.startsWith("张")).filter(s->s.length()>2).forEach(System.out::println);
        }

     2.字符流的生成方式

     

        public static void main(String[] args) {
    //        1.Collections体系的集合可以使用默认方法stream()生成流
            ArrayList<String> arrayList = new ArrayList<>();
            Stream<String> stream0 = arrayList.stream();
            HashSet<String> hashSet = new HashSet<>();
            Stream<String> stream1 = hashSet.stream();
    //        2.Map体系集合间接生成流
            HashMap<String, Integer> hashMap = new HashMap<>();
            Set<String> set = hashMap.keySet();
            Stream<String> stream2 = set.stream();
            Stream<Integer> stream3 = hashMap.values().stream();
            Stream<Map.Entry<String, Integer>> stream4 = hashMap.entrySet().stream();
    //        3.数组可以通过Stream接口的静态方法of(T...value)生成流
            String[] strings = {"大","中","小"};
            Stream<String> stream5 = Stream.of(strings);
            Stream<Integer> stream6 = Stream.of(1, 2, 3);
            Stream<String> stream7 = Stream.of("李梦瑶", "赵晓燕", "刘晨光");
        }

    3.Stream常用中间操作

    filter:

        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("张无忌");
            list.add("张三丰");
            list.add("张曼玉");
            list.add("张飞");
            list.add("刘晓彤");
            list.add("闫云书");
    //        1.输出list中以张开头的数据
            list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);
    //        2.输出长度为3的数据
            list.stream().filter(s->s.length()==3).forEach(System.out::println);
    //        3.输出list中以张开头长度为3的数据
            list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
        }

    limit&skip:

    //        1.输出集合前3个数据
            list.stream().limit(3).forEach(System.out::println);
    //        2.跳过集合前3个数据,然后输出后面的数据
            list.stream().skip(3).forEach(System.out::println);
    //        3.跳过前2个,然后输出剩下的数据的前2个
            list.stream().skip(2).limit(2).forEach(System.out::println);

    concat&distinct:

    :(可以理解为去重)

    //        1.取出list的前四个数据组成一个流,然后跳过list前两个数据,取出剩下的元素组成一个流
            Stream<String> stream1 = list.stream().limit(4);
            Stream<String> stream2 = list.stream().skip(2);
    //        2.合并上面两个流并打印出来
            Stream.concat(stream1,stream2).forEach(System.out::println);
    //        3.合并步骤一的两个流,并打印出来,要求输出的字符串不能重复
            Stream.concat(stream1,stream2).distinct().forEach(System.out::println);

    sorted:

            ArrayList<String> list2 = new ArrayList<>();
            list2.add("qqqqqqqq");
            list2.add("wwwwww");
            list2.add("eeee");
            list2.add("rrrrr");
            list2.add("tttt");
            list2.add("yyyy");
    //        1.将数据自然排序(按照字母顺序)并输出
            list2.stream().sorted().forEach(System.out::println);
    //        2.按照长度顺序排序,长度相等按照字母顺序排序
    //        list2.stream().sorted((s1,s2)->s1.length()-s2.length());//只按照长度排序了,长度一样的按照添加顺序排序的
              list2.stream().sorted((s1,s2)->{
                  int num=s1.length()-s2.length();
                  int num2=num==0?s1.compareTo(s2):num;
                  return num2;
              });

    map&mapToInt:

            ArrayList<String> list3 = new ArrayList<>();
            list3.add("1");
            list3.add("2");
            list3.add("3");
            list3.add("4");
            list3.add("5");
            list3.add("6");
    //        1.将list中的数据转化为int类型的然后输出
            list3.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
            list3.stream().map(Integer::parseInt).forEach(System.out::println);
            list3.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
    //        mapToInt()返回IntStream类型的流,该类有一个特有方法:int sum() 返回此流中元素的总和。
            int sum = list3.stream().mapToInt(Integer::parseInt).sum();
            System.out.println(sum);

    4.Stream流常见终结操作

            ArrayList<String> list = new ArrayList<>();
            list.add("张无忌");
            list.add("张三丰");
            list.add("张曼玉");
            list.add("张飞");
            list.add("刘晓彤");
            list.add("闫云书");
    //        1.将集合list所有元素在控制台输出
            list.stream().forEach(System.out::println);
    //        2.统计list集合有多少以"张"开头的数据,并输出统计结果
            long count = list.stream().filter(s -> s.startsWith("张")).count();
            System.out.println(count);            

    5.练习

    public class ActorDemo {
        public static void main(String[] args) {
            ArrayList<String> manList = new ArrayList<>();
            manList.add("周星驰");
            manList.add("成龙");
            manList.add("周润发");
            manList.add("刘德华");
            manList.add("卓比林");
            manList.add("郭德纲");
            ArrayList<String> womanList = new ArrayList<>();
            womanList.add("林青霞");
            womanList.add("李沁");
            womanList.add("林黛玉");
            womanList.add("巩俐");
            womanList.add("宋祖英");
            womanList.add("范冰冰");
            womanList.add("关晓彤");
    //        1.男演员只要名字为三个字的前三个
            Stream<String> stream = manList.stream().filter(s -> s.length() == 3).limit(3);
    //        2.女演员只要姓林的,并且不要第一个
            Stream<String> stream1 = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
    //        3.把过滤后的男演员女演员合并
            Stream<String> concat = Stream.concat(stream, stream1);
    //        4.把上一步的操作后的元素作为构造方法的参数创建演员Actor对象,并遍历
            concat.map(Actor::new).forEach(actor -> System.out.println(actor.getName()));
    
    //        上面四步合并成一步
    
            Stream.concat(manList.stream().filter(s -> s.length()==3).limit(3),womanList.stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new).forEach(actor -> System.out.println(actor.getName()));
        }
    }

    6.Stream流的收集操作

    public class CollectDemo {
        public static void main(String[] args) {
            ArrayList<String> womanList = new ArrayList<>();
            womanList.add("林青霞");
            womanList.add("李沁");
            womanList.add("林黛玉");
            womanList.add("巩俐");
            womanList.add("宋祖英");
            womanList.add("范冰冰");
            womanList.add("关晓彤");
    //        1.获得名字长度为3的流,并收集到新的List中和set中
            Stream<String> stream = womanList.stream().filter(s -> s.length() == 3);
            List<String> list = stream.collect(Collectors.toList());
            for (String s : list) {
                System.out.println(s);
            }
            Stream<String> stream2 = womanList.stream().filter(s -> s.length() == 3);
            Set<String> set = stream2.collect(Collectors.toSet());
            for (String s : set) {
                System.out.println(s);
            }
            String actor[] = {"林青霞,30", "张曼玉,29", "李沁,17"};
    //        1.得到字符串数组中年龄大于28的流
            Stream<String> actorStream = Stream.of(actor);
            Stream<String> stringStream = actorStream.filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
    //        2.把上面流的数据收集到map集合,姓名做键,年龄做值
            Map<String, String> map = stringStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
            Set<String> keySet = map.keySet();
            for (String s : keySet) {
                System.out.println(s + map.get(s));
            }
        }
    }
  • 相关阅读:
    socketpair + signal + select 的套路
    java 远程调用 RPC
    Java 序列化
    Java Socket 编程
    云计算 IaaS,SaaS,PaaS的区别?一个通俗易懂的吃货文章
    如何应对网站反爬虫策略?如何高效地爬大量数据?
    java NIO详解
    LigerUI LigerGrid getSelectedRows() 多选顺序 不是从上到下修改方法
    JSON风格指南
    Json 工具介绍 fastjson gson jackson
  • 原文地址:https://www.cnblogs.com/luzhanshi/p/13205589.html
Copyright © 2011-2022 走看看