JAVA学习-Stream流的生成、中间操作、终结、收集操作

Stream流的使用-用于数据集的过滤、映射

1、生成流的操作:通过数据源、集合生成流list.stream()
2、中间操作:一个流可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤、映射,然后返回一个新的流,交给接下来的流使用;filter()
3、终极操作:后续就无法再使用这个流了,foreach()

Stream流的生成方式

在这里插入图片描述
生成流实例

        //Collection体系的集合可以使用默认方法stream()生成流
        List<String> li = new ArrayList<String>();
        Stream<String> listream = li.stream();
        Set<String> hstr = new HashSet<>();
        Stream<String> hstrstream = hstr.stream();

        //Map体系的方法间接生成流
        Map<String,Integer> map = new HashMap<String,Integer>();
        Stream<String> keystream = map.keySet().stream();
        Stream<Integer> valstream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entstream = map.entrySet().stream();

        //数据可以通过Stream接口的静态方法of(T...value)生成流
        String[] atrarray={
    
    "ss","3dd","dssd"};
        Stream<String> atrstream = Stream.of(atrarray);
        Stream<String> atrstream1 = Stream.of("sdsd", "dsds", "deee");
        Stream<Integer> integerStream = Stream.of(12, 32, 232, 33);

Stream流常见的中间操作方法

1、Stream filter​(Predicate<? super T> predicate)
返回由与此给定谓词匹配的此流的元素组成的流

2、Stream limit​(long maxSize)
返回由此流的元素组成的流,截短长度不能超过 maxSize

3、Stream skip​(long n)
在丢弃流的第一个 n元素后,返回由该流的剩余元素组成的流。

4、static Stream concat​(Stream<? extends T> a, Stream<? extends T> b)
创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。
是一个静态方法,将两个流合并

5、distinct​()
返回由该流的不同元素(根据 Object.equals(Object) )组成的流。

6、Stream sorted​()
返回由此流的元素组成的流,根据自然顺序排序
Stream sorted​(Comparator<? super T> comparator)
返回由该流的元素组成的流,根据提供的 Comparator进行排序。

7、 Stream map​(Function<? super T,? extends R> mapper)
返回由给定函数应用于此流的元素的结果组成的流。
8、IntStream mapToInt​(ToIntFunction<? super T> mapper)
返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。
IntStream中还有Stream中没有的sum等方法


      List<String> list = new ArrayList<String>();
        list.add("21");
        list.add("3322");
        list.add("322");
        list.add("32234");
        list.add("3233");
        list.add("3783");
//把list集合以3开头的数字输出
        list.stream().filter(s -> s.startsWith("3")).forEach(System.out::println);
        System.out.println("---");
        //把list集合以3开头且长度为4的数字输出
        list.stream().filter(s -> s.startsWith("3")).filter(s -> s.length() ==4 ).forEach(System.out::println);
        System.out.println("---");
//取前4个
        Stream<String> s1 = list.stream().limit(4);
//        跳过前2个取后面的数
        Stream<String> s2 = list.stream().skip(2);
//        合并流
//        Stream.concat(s1,s2).forEach(System.out::println);
        //合并流并且不重复
  Stream.concat(s1,s2).distinct().forEach(System.out::println);

Stream流的常见终结操作:for each、count

1、void forEach​(IntConsumer action)
对此流的每个元素执行操作。
2、long count​()
返回此流中的元素数。

Stream流的收集操作collect

对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中。
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中


        //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
        Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));

猜你喜欢

转载自blog.csdn.net/weixin_52723971/article/details/111663835