Java中的Stream流

Stream流

初识Stream流

体验Stream;流的作用

需求:按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素

ArrayList<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");

要求:

  • 把所有以“张”开头的元素存储到新集合中
  • 把“张”开头的,长度为3的元素再存储到新集合中
  • 遍历打印最终结果
package com.example.demo;

import java.util.ArrayList;

public class Text {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

//        1.把所有以“张”开头的元素存储到新集合中
        ArrayList<String> list1 = new ArrayList<>();
        for (String name : list) {
            if(name.startsWith("张")){
                list1.add(name);
            }
        }

//        2.把“张”开头的,长度为3的元素再存储到新集合中
        ArrayList<String> list2 = new ArrayList<>();
        for (String name : list1) {
            if(name.length() == 3){
                list2.add(name);
            }
        }

//        3.遍历打印最终结果
        System.out.println(list2);
    }
}
package com.example.demo;

import java.util.ArrayList;

public class Text {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

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

Stream流的作用

结合Lambda表达式,简化集合、数组的操作

Stream流的使用步骤

①先得到一条Stream流(流水线),并把数据放上去

在这里插入图片描述

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;

public class Text {
    public static void main(String[] args) {
        //单列集合
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e");
        list.stream().forEach(s-> System.out.println(s));
    }
}
package com.example.demo;

import java.util.HashMap;

public class StreamDemo2 {
    public static void main(String[] args) {
//        1.创建双列集合
        HashMap<String,Integer> hm = new HashMap<>();
//        2.添加数据
        hm.put("a",1);
        hm.put("b",2);
        hm.put("c",3);
        hm.put("d",4);
//        3.第一种获取获取Stream流的方法
//        hm.keySet().stream().forEach(s-> System.out.println(s));
//        4.第二种获取Stream流的方法
        hm.entrySet().stream().forEach(s-> System.out.println(s));
    }
}
package com.example.demo;

import java.util.Arrays;

public class StreamDemo3 {
    public static void main(String[] args) {
//        1.创建数组
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
//        2.获取Stream流,引用数据类型同样适用
        Arrays.stream(arr).forEach(s-> System.out.println(s));
    }
}
package com.example.demo;

import java.util.stream.Stream;

public class StreamDemo4 {
    public static void main(String[] args) {
    //一对零散的数据
        Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));
        Stream.of("a","b","c").forEach(s -> System.out.println(s));
        //Stream接口中静态方法of的细节
        //方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
        //但数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中
    }
}

②利用Stream流中的API进行各种操作

1.过滤 转换 中间方法:方法调用完毕之后,还可以调用其他方法

在这里插入图片描述

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;

public class StreamDemo5 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌","周芷若","赵敏","张三丰");
        list.stream().filter(s-> s.startsWith("张"))
                .filter(s->s.length() == 3)
                .forEach(s-> System.out.println(s));
        list.stream().limit(3).forEach(s-> System.out.println(s));
        list.stream().skip(4).forEach(s-> System.out.println(s));   
    }
}

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;

public class StreamDemo6 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌","张无忌","张无忌","周芷若","赵敏","张三丰");
        list.stream().distinct().forEach(s-> System.out.println(s));
    }
}
package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;

public class StreamDemo7 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌-15","张无忌-15","张无忌-15","周芷若-16","赵敏-17","张三丰-17");
//        需求:只获取里面的年龄并进行打印
//        第一个类型:流中原来的数据类型
//        第二个类型:要转成之后的数据类型
//        apply的形参s:依次表示流里面的每一个数据
//        返回值:表示转换之后的数据
//        当map方法执行完毕之后,流上的数据就变成整数了
//        所以forEach方法里的s依次表示流里面的每一个数据,这个数据现在是整数
        list.stream().map(new Function<String, Integer>() {
            public Integer apply(String s){
                String[] arr = s.split("-");
                String ageString = arr[1];
                int age = Integer.parseInt(ageString);
                return age;
            }
        }).forEach(s-> System.out.println(s));

        list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
    }
}

注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。

注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据。

2.统计 打印 终结方法:最后一步,调用完毕之后,不能调用其他方法

在这里插入图片描述

package com.example.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;

public class StreamDemo8 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "张无忌", "张无忌", "周芷若", "赵敏", "张三丰", "张强");
        //Consumer的泛型:表示流里面的数据

        //accept方法的形参s:依次表示流里面的每一个数据
//        方法体:对每一个数据的处理操作(打印)
        /*list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });*/

//        list.stream().forEach(s-> System.out.println(s));

//        long count = list.stream().count();
//        System.out.println(count);

//        Object[] arr = list.stream().toArray();
//        System.out.println(Arrays.toString(arr));

        //IntFunction的泛型:具体数组的类型
        //apply的形参:流中数据的个数,要跟数组的长度保持一致
        //apply返回值:具体类型的数组
        //方法体:就是创建数组

        //toArray方法的参数的作用:负责创建一个指定类型的数组
        //toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中
        //toArray方法的返回值:是一个装着流里面所有数据的数组
//        String[] arr = list.stream().toArray(new IntFunction<String[]>() {
//            @Override
//            public String[] apply(int value) {
//                return new String[value];
//            }
//        });
//
//        System.out.println(Arrays.toString(arr));

        String[] arr2 = list.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
    }
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值