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));
        }
    }
}
原文地址:https://www.cnblogs.com/luzhanshi/p/13205589.html