Stream流

发布时间 2023-04-01 11:34:21作者: 卡卡罗特kk

strean只能被消费一次

三种创建方法

  1. 针对集合Collection, stream(), 接口当中定义的默认方法.
  2. Arrays.stream(T[] t), 把数组搞成一个Stream流
  3. Stream.of(T ... t), 将一系列的值转换为Stream对象

获取的三种方式:
返回值都是接口类型的: Stream, 那么返回的一定是: 实现了该接口的实现类的对象.
对象.方法(); // 不考虑静态的啥的.

Stream流的常用方法

image
image

点击查看代码
package com.qf.deom01;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class Test01 {
    public static void main(String[] args) {
        List<String> nameList =new ArrayList<>();
        nameList.add("tom");
        nameList.add("tomtomtomtomtomtomtomtom");
        nameList.add("jack");
        nameList.add("rose");
        nameList.add("john");
        nameList.add("old wang");
        nameList.add("jerry");
        nameList.add("li lei");
        nameList.add("marry");
        nameList.add("bird");
        nameList.add("milk");
        nameList.add("jerry");
        nameList.add("li lei");
        nameList.add("marry");
        nameList.add("bird");
        nameList.add("milk");
      List<Integer> number =new ArrayList<>();
      number.add(1);
      number.add(2);
      number.add(10);
      number.add(5);
        //找出”j的人“(filter)predicate->过滤
        nameList.stream().filter(s ->s.startsWith("j")).forEach(s -> System.out.println(s));
        System.out.println("---------------");
        //把j的人转大写
        nameList.stream().filter(s -> s.startsWith("j")).map(s->s.toUpperCase()).forEach(s -> System.out.println(s));
        System.out.println("------------------------");
        //跳过 ship
        nameList.stream().filter(s -> s.startsWith("j")).skip(2).forEach(s -> System.out.println(s));
         System.out.println("------------------------");
        //去重distinct,表示对当前集合进行去除操作,重写equals和HashCode
        nameList.stream().distinct().filter(s -> s.startsWith("j")).forEach(s -> System.out.println(s));

        System.out.println("------------------------");
        //peek,中间方法,可以进行遍历
       nameList.stream().filter(s -> s.startsWith("j")).peek(s -> System.out.println(s)).
               map(s -> s.toUpperCase()).forEach(s -> System.out.println(s));
       //count计算集合种元素的数量,终结方法
        System.out.println(nameList.stream().count());
        /*//合并流
        Stream<Stream> mySteam =Stream.of(nameList.stream(),listName.stream());
        System.out.println(mySteam.count());*/
        System.out.println("------------------------");
        //findFirst,返会第一个元素
//        Optional java8新特性,get表示储存在optional对象中的值
        Optional<String> nameFirst =nameList.stream().peek(s -> System.out.println(s)).findFirst();
        String str = nameFirst.get();
        System.out.println(nameFirst.get());
        System.out.println("------------------------");
        //findAny返回任意元素
        Optional optional =nameList.stream().findAny();
        System.out.println(optional.get());
        System.out.println("------------------------");
        //// 10. anyMatch, allMatch ,noneMatch
        //anyMatch任意元素匹配时
        Boolean result=nameList.stream().anyMatch(s ->s.startsWith("t"));
        System.out.println(result);
        //allMath所有元素匹配
        Boolean result2 =nameList.stream().allMatch(s -> s.length()>3);
        System.out.println(result2);
        //noneMatch所有元素都不匹配
        Boolean result3 =nameList.stream().noneMatch(s -> s.equalsIgnoreCase("BBB"));
        System.out.println(result3);
        //reduce 参数传递是biFunction, R apply(T, U)
        Integer tem=number.stream().reduce((s1,s2)->s2+s1).get();
        System.out.println(tem);
        //T identity//表示操作的基数
        Integer tem2 =number.stream().reduce(100,(s1,s2)->s1+s2);
        System.out.println(tem2);
//         Integer sum = number.stream().reduce(100, (a, b) -> a - b, (a, b) -> a +b );
//         System.out.println(sum);
        System.out.println("------------------------");
//        limit,从数据当中读出n条数据;中间数据
        number.stream().limit(3).forEach(s->System.out.println(s));
        number.stream().limit(3).peek(s->System.out.println("ttt"+s)).findFirst();//未加终结操作,无法打印peek
    }
}

总结Stream常用方法

  1. filter
  2. map
  3. limit
  4. distinct()
  5. sorted, 两个
  6. anyMatch
  7. allMaatch

收集方法

  1. Stream接口当中定义了一个方法, 这个方法就是收集方法.
  2. Stream流当中的数据—> 还原成集合等/字符串/.
    <R, A> R collect(Collector<? super T, A, R> collector)
    这个方法的参数是一个接口: Collector.
    public interface Collector<T, A, R> {}
    提供了一个工具类: Collectors. 表示对Collector的封装

/ 1. 接口当中Stream定义了一个收集的方法;
collect(传递一个接口: Collector) // Collector接口有一个工具类,专门创建对象: Collectors
// Collectors当中提供了大量的静态方法,返回值就是Collector, 所以咱们可以直接把
Collectors.toList/toSet传入到collect方法当中

点击查看代码

将流转换为想要的集合

/**
 * 
 */
public class Test01 {
    public static void main(String[] args) {
        List<String> nameList =new ArrayList<>();
        nameList.add("tom");
        nameList.add("tomtomtomtomtomtomtomtom");
        nameList.add("jack");
        nameList.add("rose");
        nameList.add("john");
        nameList.add("old wang");
        nameList.add("jerry");
        nameList.add("li lei");
        nameList.add("marry");
        nameList.add("bird");
        nameList.add("milk");
        nameList.add("jerry");
        nameList.add("li lei");
        nameList.add("marry");
        nameList.add("bird");
        nameList.add("milk");
        List<String> list=nameList.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
        //collect可以将流转换为集合,参数为collector,这是一个接口,
        //这个接口提供了一个工具类:Collectors这个工具类当中的静态方法返回的就是: 实现了
        //Collector接口的实现类的对象.所以可以直接传入到Collect方法当中.\
        list.forEach(s -> System.out.println(s));
        System.out.println(list);
        System.out.println("------------");
        Set<String> set=nameList.stream().filter(s -> s.contains("l")).distinct().collect(Collectors.toSet());
        System.out.println(set);
        System.out.println("------------");
        Object [] tl=nameList.stream().toArray();
        System.out.println(Arrays.toString(tl));
        System.out.println("------------------------------");
        //Collections接口只有List/Set?????Collect
        //toCollection当中传入的是一个Supplier接口.
        ArrayList<String> arrayList=nameList.stream().collect(Collectors.toCollection(()->new ArrayList<>()));
        HashSet<String>hashSet=nameList.stream().collect(Collectors.toCollection(()->new HashSet<>()));

将流转换为字符串

点击查看代码
/*Collectors.joining() // 默认没有分隔符
        Collectors.joining("分隔符") // 默认没有分隔符
        Collectors.joining("分隔符", "前缀", "后缀") // 默认没有分隔符*/
        //将流转换为字符串
        System.out.println("------------------------------");
        String str = nameList.stream().filter(s -> s.length()>8).collect(Collectors.joining());
        System.out.println(str);
        System.out.println(nameList.stream().filter(s -> s.length()>4).collect(Collectors.joining("   ")));
        System.out.println(nameList.stream().filter(s -> s.length()>4).
                collect(Collectors.joining("    ","[","}")));

分组

简单分组partitioningBy(Boolean)

点击查看代码
package com.qf.deom03;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test01 {
    public static void main(String[] args) {
        List<User> nameList = new ArrayList<>();
        nameList.add(new User("卡卡罗特",118));
        nameList.add(new User("贝吉塔",181));
        nameList.add(new User("特兰克斯",8));
        nameList.add(new User("悟饭",8));
        nameList.add(new User("悟天",4));
        nameList.add(new User("沙鲁",18));
        nameList.add(new User("布罗利",38));
        //partitioningBy(Boolean)
        Map<Boolean,List<User>> mapUser=nameList.stream().collect(Collectors.partitioningBy(person->person.getName().contains("悟")));
        mapUser.forEach((k,v)->{
            System.out.println(k);
            System.out.println(v);
        }
        );
    }
}
结果
![image](https://img2023.cnblogs.com/blog/2326800/202304/2326800-20230401112211435-602612631.png)

按照你自定义的要求进行分析groupingBy

点击查看代码
package com.qf.deom03;

import java.util.*;
import java.util.stream.Collectors;

public class Test02 {
    public static void main(String[] args) {
        List<User> nameList = new ArrayList<>();
        nameList.add(new User("卡卡罗特",118));
        nameList.add(new User("贝吉塔",181));
        nameList.add(new User("特兰克斯",8));
        nameList.add(new User("悟饭",8));
        nameList.add(new User("悟天",4));
        nameList.add(new User("沙鲁",18));
        nameList.add(new User("布罗利",38));
        //groupingBy(可以自定义)
        Map<String,List<User>> listMap =
                nameList.stream().collect(Collectors.groupingBy(user -> user.getName().substring(0,2)));
        //keyset遍历
        Set<String> setUser =listMap.keySet();
        for (String s : setUser) {
            System.out.println(s);
            List<User> users =listMap.get(s);
            users.forEach(k->System.out.println(k));
        }
        System.out.println("-----------------------------");
        //foreach遍历
        listMap.forEach((k,v)->{
            System.out.println(k);
            System.out.println(v);
        });
        System.out.println(listMap.size());
        System.out.println(nameList.size());


        System.out.println("-----------------------------");
        TreeMap<String, Set<User>> treeMap = nameList.stream()
                .collect(Collectors.groupingBy(user -> user.getName().substring(0, 2),
                        () -> new TreeMap<>(),
                        Collectors.toSet()));

        treeMap.forEach((k, v) -> {
            System.out.println(k);
            v.forEach(s -> System.out.println(s));
            System.out.println("--------------------------");
        });
    }
}

结果
![image](https://img2023.cnblogs.com/blog/2326800/202304/2326800-20230401112552719-942751216.png)

数据统计summarizingInt

点击查看代码
package com.qf.deom03;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.stream.Collectors;

public class Test04 {
    public static void main(String[] args) {
        Integer[] score = {20, 48, 13, 56, 89, 32, 21, 23, 1, 23, 1, 432, 4, 235, 3, 43, 23, 123};
        IntSummaryStatistics sum = Arrays.stream(score).collect(Collectors.summarizingInt(i->i));
        System.out.println(sum.getSum()); // 求和
        System.out.println(sum.getAverage()); // 平均数
        System.out.println(sum.getMax()); // 最大值
        System.out.println(sum.getMin()); // 最小值
        System.out.println(sum.getCount()); // 元素的个数
    }
}