2.Stream流2.1体验Stream流【理解】案例需求按照下面的要求完成集合的创建和遍历创建一个集合存储多个字符串元素把集合中所有以张开头的元素存储到一个新的集合把张开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合Stream流的常见生成方式【应用】Stream流的思想Stream流的三类方法获取Stream流创建一条流水线,并把数据放到流水线上准备进行操作中间方法流水线上的操作一次操作完毕之后,还可以继续进行其他操作终结方法一个Stream流只能有一个终结方法是流水线上的最后一个操作生成Stream流的方式Collection体系集合使用默认方法stream()生成流 default StreamE stream()Map体系集合把Map转成Set集合间接的生成流数组通过Arrays中的静态方法stream生成流同种数据类型的多个数据通过Stream接口的静态方法of(T... values)生成流2.3Stream流中间操作方法【应用】概念中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作常见方法方法名说明StreamT filter(Predicate predicate)用于对流中的数据进行过滤StreamT limit(long maxSize)返回此流中的元素组成的流截取前指定参数个数的数据StreamT skip(long n)跳过指定参数个数的数据返回由该流的剩余元素组成的流static T StreamT concat(Stream a, Stream b)合并a和b两个流为一个流StreamT distinct()返回由该流的不同元素根据Object.equals(Object) 组成的流2.4Stream流终结操作方法【应用】概念终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作常见方法方法名说明void forEach(Consumer action)对此流的每个元素执行操作long count()返回此流中的元素数2.5Stream流的收集操作【应用】概念对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中常用方法方法名说明R collect(Collector collector)把结果收集到集合中工具类Collectors提供了具体的收集方式方法名说明public static T Collector toList()把元素收集到List集合中public static T Collector toSet()把元素收集到Set集合中public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中3.方法引用3.1体验方法引用【理解】方法引用的出现原因在使用Lambda表达式的时候我们实际上传递进去的代码就是一种解决方案拿参数做操作那么考虑一种情况如果我们在Lambda中所指定的操作方案已经有地方存在相同方案那是否还有必要再写重复逻辑呢答案肯定是没有必要那我们又是如何使用已经存在的方案的呢这就是我们要讲解的方法引用我们是通过方法引用来使用已经存在的方案3.2方法引用符【理解】方法引用符:: 该符号为引用运算符而它所在的表达式被称为方法引用推导与省略如果使用Lambda那么根据“可推导就是可省略”的原则无需指定参数类型也无需指定的重载形式它们都将被自动推导如果使用方法引用也是同样可以根据上下文进行推导方法引用是Lambda的孪生兄弟3.3引用类方法【应用】 引用类方法其实就是引用类的静态方法格式类名::静态方法范例Integer::parseIntInteger类的方法public static int parseInt(String s) 将此String转换为int类型数据练习描述定义一个接口(Converter)里面定义一个抽象方法 int convert(String s);定义一个测试类(ConverterDemo)在测试类中提供两个方法一个方法是useConverter(Converter c)一个方法是主方法在主方法中调用useConverter方法3.4引用对象的实例方法【应用】 引用对象的实例方法其实就引用类中的成员方法格式对象::成员方法范例HelloWorld::toUpperCaseString类中的方法public String toUpperCase() 将此String所有字符转换为大写练习描述定义一个类(PrintString)里面定义一个方法public void printUpper(String s)把字符串参数变成大写的数据然后在控制台输出定义一个接口(Printer)里面定义一个抽象方法void printUpperCase(String s)定义一个测试类(PrinterDemo)在测试类中提供两个方法一个方法是usePrinter(Printer p)一个方法是主方法在主方法中调用usePrinter方法3.5引用类的实例方法【应用】 引用类的实例方法其实就是引用类中的成员方法格式类名::成员方法范例String::substringpublic String substring(int beginIndex,int endIndex)从beginIndex开始到endIndex结束截取字符串。返回一个子串子串的长度为endIndex-beginIndex练习描述定义一个接口(MyString)里面定义一个抽象方法String mySubString(String s,int x,int y);定义一个测试类(MyStringDemo)在测试类中提供两个方法一个方法是useMyString(MyString my)一个方法是主方法在主方法中调用useMyString方法3.6引用构造器【应用】 引用构造器其实就是引用构造方法l格式类名::new范例Student::new练习描述定义一个类(Student)里面有两个成员变量(name,age)并提供无参构造方法和带参构造方法以及成员变量对应的get和set方法定义一个接口(StudentBuilder)里面定义一个抽象方法Student build(String name,int age);定义一个测试类(StudentDemo)在测试类中提供两个方法一个方法是useStudentBuilder(StudentBuilder s)一个方法是主方法在主方法中调用useStudentBuilder方法