zoukankan      html  css  js  c++  java
  • Stream流

    使用Stream流的方式,对集合中的数据进行过滤

    Stream流是JDK1.8之后出现的

    关注的是做什么,而不是怎么做。

    package day15;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo01 {
        public static void main(String[] args) {
            List<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流"其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其他地址值)

    Stream是一个来自数据源的元素队列

    • 元素是特定类型的对象,形成一个队列。java中的Stream并不会存储元素,而是按需计算。
    • 数据源流的来源,可以是集合、数组等。

    和以前的Collection操作不同,Stream操作还有两个基础的特征:

    • Pipelinging:中间操作都会返回流本身。这样多个操作可以串联成一个管道,如同流式风格(fluent style)。这样做可以对操作进行优化;比如延迟执行(laziness)和短路(short-circuiting)。
    • 内部迭代:以前对集合遍历都是通过lterator或者增强for的方式,显示的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,流可以直接调用遍历方法。

    当使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)->数据转换 ->执行操作或许想要的结果,每次转换原有的Stream对象不改变,返回一个新的Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道。

    获取流

    java.util.stream.Stream 是Java 8新加入的最常用的流接口。(这并不是一个函数式接口)

    获取一个流非常简单,有以下几种常用的方式:

    • 所有的Collection集合都可以通过stream默认方法获取流

      • default Stream stream()
    • Stream接口的静态方法or可以获取数组对应的流。

      • static Stream of (T...values)

        参数是一个可变参数,那么我们就可以传递一个数组。

    根据Collection获取流

    首先,java.util.Collection接口中加入了default方法stream用来获取流,所以其所有实现类均可获取流。

    package day15;
    
    import java.util.*;
    import java.util.stream.Stream;
    
    public class GetStream {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            Stream<String> stream = list.stream();
    
            Set<String> set = new HashSet<>();
            Stream<String> stream2 = set.stream();
    
            Map<String,String> map = new HashMap<>();
            Set<String> keySet = map.keySet();
            Stream<String> stream3 = keySet.stream();
    
            Collection<String> values = map.values();
            Stream<String> stream4 = values.stream();
    
            Set<Map.Entry<String,String>> entries = map.entrySet();
            Stream<Map.Entry<String,String>> stream5 = entries.stream();
    
            Stream<Integer> stream6 = Stream.of(1,2,3,4,5);
            Integer[] arr = {1,2,3,4,5};
            Stream<Integer> stream7 = Stream.of(arr);
            String[] arr2 = {"a","bb","ccc"};
            Stream<String> stream8 = Stream.of(arr2);
        }
    }
    

    Stream流的常用方法——forEach

    流模型的操作很丰富,这里介绍一些常用的API。这里介绍一些常用的API。这些方法可以被分成两种:

    • 延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为延迟方法。)
    • 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。

    逐一处理:forEach

    虽然方法名字叫forEach,但是与for循环的“for-each”昵称不同。

    void forEach(Consumer<? super T> action);

    该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。

    复习Consumer接口

    java.util.function.Consumer接口是一个消费型接口。

    Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。

    Consumer接口是一个消费型的函数式接口,可以传递lambda表达式,消费数据

    简单记:

    ​ forEach方法,用来遍历流中的数据

    ​ 是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法。

    package day15;
    
    import java.util.stream.Stream;
    
    public class ForEach {
        public static void main(String[] args) {
            //获取一个stream流
            Stream<String> stream = Stream.of("张三","李四","王五","赵六","田七");
            //使用stream流中的方法forEach对stream流中的数据进行遍历
            stream.forEach((String name)->{
                System.out.println(name);
            });
    
            stream.forEach(name-> System.out.println(name));
        }
    }
    
  • 相关阅读:
    Java实现第八届蓝桥杯9算数式
    Java实现第八届蓝桥杯9算数式
    java实现第七届蓝桥杯寒假作业
    java实现第七届蓝桥杯寒假作业
    java实现第六届蓝桥杯隔行变色
    java实现第六届蓝桥杯无穷分数
    mysql-5.7.19-winx64服务无法启动解决方案
    MySQL集群搭建详解
    Windows下多个Mysql实例配置主从
    在一台机子上,安装,运行两mysql数据库实例
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14013568.html
Copyright © 2011-2022 走看看