0
点赞
收藏
分享

微信扫一扫

Java | Stream流

忆北文学摄影爱好员 2022-04-08 阅读 69
java

一、Stream流生成方式

1、生成流

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

常见生成方式:

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

(2)Map体系的集合间接的生成流

(3)数组可以通过Stream接口的静态方法of(T…valus)生成流

public class StreamDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Stream<String> listStream = list.stream();

        Set<String> set = new HashSet<>();
        Stream<String> setStream = set.stream();

        //Map体系间接生成流
        Map<String, Integer> map = new HashMap<>();
        Stream<String> mapkeyStream = map.keySet().stream();
        Stream<Integer> mapValueStream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

        //数组通过Stream接口的静态方法生成流
        String[] array = {"hello","world"};
        Stream<String> strStream = Stream.of(array);
        Stream<String> strStream2 = Stream.of("hello","world");
    }
}

2、中间操作

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

(1)Stream <T> filter(Predicate predicate)

对流中的数据进行过滤

public class StreamDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("甄嬛");
        list.add("华妃");
        list.add("沈眉庄");
        list.add("安陵容");
        list.add("甄玉娆");

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

(2)Stream <T>  limit(long maxSize)

返回此流中的元素组成的流,截取前指定参数个数的数据

(3)Stream <T>  skip(long n)

跳过指定参数个数的数据,返回由该流的剩余元素组成的流

        //把前三个元素输出
       list.stream().limit(3).forEach(System.out::println);
       System.out.println("-----------");

       //跳过3个元素,把剩下的输出
        list.stream().skip(3).forEach(System.out::println);
        System.out.println("-----------");
        
        //跳过2个元素,把剩下的前2个输出
        list.stream().skip(2).limit(2).forEach(System.out::println);

(4)static Stream <T>  concat(Stream a, Stream b)

合并a和b两个流为一个流

(5)Stream <T> distinct()

返回由该流的不同元素组成的流,根据Object.equals(Object)方法判断

        //取前4个数据组成一个流
        Stream<String> s1 = list.stream().limit(4);

        //跳过前2个元素组成一个流
        Stream<String> s2 = list.stream().skip(2);

        //合并刚才得到的两个流,元素不能重复
        Stream.concat(s1, s2).distinct().forEach(System.out::println);

(6)Stream <T> sorted()

         Stream <T> sorted(Comparator comparator)

返回由该流的元素组成的流,根据提供的comparator进行排序

//        list.stream().sorted().forEach(System.out::println);

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

(7) Stream <T> map (Function mapper)

返回由给定函数应用于此流的元素的结果组成的流

(8) Stream <T> mapToInt (ToIntFunction mapper)

返回一个intStream其中包含将给定函数应用于此流的元素的结果

intStream:表示原始int流

ToIntFunciton:接口中的方法 int appltAsInt(T value)

        list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
        //intStream特有方法 求和
        int sum = list.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);

3、终结操作

一个流只能有一个终结操作,当这个操作执行后,流就被用完了,无法再被操作,所以这一定是流的最后一个操作。

(1)void forEach(Consumer action)

对此流的每个元素执行操作

(2)long count()

返回此流中的元素数

4、Stream的收集操作

(1)R collection(Collector collector)

收集方法的参数是一个collector接口

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

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

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

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

        Stream<String> listStream = list.stream().filter(s -> s.length() == 3);
        List<String> names = listStream.collect(Collectors.toList());
        for(String name:names){
            System.out.println(name);
        }

        Stream<Integer> ageStream = set.stream().filter(i -> i > 25);
        Set<Integer> ages = ageStream.collect(Collectors.toSet());
        for(int age:ages){
            System.out.println(age);
        }
        String[] strArray = {"甄嬛,17","华妃,20","安陵容,17","眉庄,18","皇后,30"};
        //收集年龄小于等于18的
        Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) <= 18);
        //收集到Map中,姓名作为键,年龄作为值
        Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
        //遍历
        Set<String> ketset = map.keySet();
        for(String key:ketset){
            Integer value = map.get(key);
            System.out.println(key+":"+value);
        }
举报

相关推荐

0 条评论