第一章Stream流
常用的流操作
1)获取流对象
*集合->流: 集合对象.stream()
例:list.stream()
.filter(name->endsWith(..))
.map(.....)
*数组->流: Stream.of(数组)
*可变参数->流:Stream of(T... values)
例:Stream<String> stream = Stream.of("张三","李四","王五","赵六");
2)Stream方法:
延迟方法:返回值仍然是stream接口自身类型的方法
*Stream filter(Predicate p): 过滤
Lambda表示需要重写Predicate<T> 参数的test(T)方法
*Stream map(Function f): 转换映射
Lambda表示需要重写Function<T,R> 参数的apply(T)方法
*Stream limit(long n): 只要前n个
只是对流中的数据进行截取,获得一个新的流
*Stream skip(long n): 不要前n个
只是对流中的数据进行截取,获得一个新的流
终结方法:返回值不再是stream接口自身类型的方法,不再支持流式编程
*long count(): 返回流中元素的个数
*void forEach(Consumer c): 遍历消费每个元素
静态方法
Stream concat(Stream s1, Stream s2):用于把两个流合并成一个新的流
3)Stream流的特点
Stream流属于管道流,只能被使用一次(每次调用方法后生成新的流),数据会转到下一个Stream中,流紧接着关闭
第二章、方法引用(简化Lambda表达式)
1.引用运算符-::
1)::的应用实例
-定义Printable函数式接口,定义方法 void print(String str);
-在Test类中定义printString方法: private static void printString(Printable p){
p.print("Hello World");
}
-在Test类主方法调用myPrint方法, printString(s->System.out.println(s));
-使用方法引用简化lambda表达式:
printString(System.out::println) //代替 printString(s->System.out.println(s));
2)引用运算符(::)的格式
*如果Lambda要表达的函数方案已经存在与某个方法的实现中
那么则可以通过::来引用该方法作为Lambda的替代
*对象::方法
对象和方法都必须是存在的
System.out对象是已经存在的
println方法也是已经存在的
Lambda中传递的参数一定是方法引用中那个方法可以接受的类型
**println()方法参数可以是String,所以没有问题
2.通过对象名引用成员方法
*使用前提:对象名是存在的,成员方法也存在,所以必须new一个对象
*-定义一个MethodReference类 创建public void printUpperCaseString方法
public void printUpperCaseString(String str){
System.out.println(str.toUpperCase());
}
-printString(new MethodReference()::printUpperCaseString)
3.通过类名引用静态成员方法
*类存在,静态成员方法也已经存在,可以通过类名直接引用
*-在MethodReferenc类中 创建一个static成员方法
public static void calLength(String str){
System.out.println(str.length());
}
-printString(MethodReference::calLength);
4.通过super引用成员方法 - super::方法
*如果存在继承关系,当Lambda中需要super调用时,也可以使用方法引用代替
*super关键字存在,一般用在类中的主方法中
5.通过this引用成员方法 - this::方法
6.类的构造器引用 - 类名称::new
7.数组的构造器引用 - 数据类型[]::new
|
|