目录
Stream流
流式思想:
终结方法
延迟方法
静态方法
获取流的方法
方法引用
具体使用方法
Stream流
以前对集合操作的时候,总是循环、循环、再循环。循环只是方式,不是目的。线性循环还有一个缺点只能遍历一次,如果还有其他操作还需要重新进行循环
Lambda的衍生物Stream(只考虑目的,不用考虑实现方式)
流式思想:
类似于流水线,一步一步的执行,中间的延迟方法都会返回一个流对象(流对象本身),最后会有终结方法
Stream流对象只能使用一次(每个模型(就是流对象)使用完后 都会自动销毁)
特点:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道
- 内部迭代:Stream提供了内部迭代的方式,流可以直接调用遍历方法。
终结方法
- void forEach(Consumer<? super T> action); 接收每一个参数 对其处理
- long count();统计元素个数
延迟方法
- Stream<T> filter(Predicate<? super T> predicate);将一个流转换成子集流,进行过滤
- <R> Stream<R> map(Function<? super T, ? extends R> mapper);映射 可以将集合内的所有元素进行类型转换
- Stream<T> skip(long n);跳过前几个
- Stream<T> limit(long maxSize);取用前几个
静态方法
- static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b):将两个流合并到一起
获取流的方法
- 根据Collection获取流:stream方法
- 根据Map获取流:单独获取键值对的Set集合,再调用stream方法
- 根据数组获取流:Stream.of(数组对象)
示例代码
public static void main(String[] args) {
Integer[] ints={1,2,3,11,33,133,22,5};
String[] strings={"张三","李四","王五","赵六","张三丰"};
Stream<Integer> ints1 = Stream.of(ints);//获得stream对象
Stream<String> strings1 = Stream.of(strings);//获得stream对象
//使用过滤器 大于5小于150 最后输出
Stream<Integer> stream1 = ints1.filter(i -> i > 5).filter(i -> i < 150);//ints1已经使用过了 不能再一次使用
//姓张且长度大于2 的姓名
Stream<String> stream2 = strings1.filter(s -> s.startsWith("张")).filter(s -> s.length() > 2);
Stream<? extends Serializable> concat = Stream.concat(stream1, stream2);//进行拼接
concat.forEach(i-> System.out.print(i+"\t"));//11 33 133 22 张三丰
Stream<Integer> ints2 = Stream.of(ints);//获得stream对象
System.out.println();
//跳过前两个 取用前四个
ints2.skip(2).limit(4).forEach(i-> System.out.print(i+"\t"));//3 11 33 133
}
方法引用
方法引用是Lambda表达式的一种简写方法
Lambda 中 传递的参数 一定是方法引用中 的那个方法可以接收的类型
public static void main(String[] args) {
//printstring("HELLO",s-> System.out.println(s));
printstring("hello", System.out::println);
}
System.out::println等价于s-> System.out.println(s)
具体使用方法
- 通过对象名使用成员方法? 对象名::成员方法名
- 通过类名称引用静态方法? 类名::方法名? 例如:Math::abs
- 通过super引用成员方法 supper::方法名
- 通过this引用成员方法 this::方法名
- 类的构造器引用?类名称::new 例如:name ‐> new Person(name)等价于Person::new
- 数组的构造器引用??length -> new int[length] 等价于int[]::new
示例代码
//父子之间的方法引用(子类调用带有函数式接口的方法,将参数传递给父类方法(无参的话之间调用父类的方法))
public class Zi extends Fu{
@Override
public void sey() {
System.out.println("我子类");
}
public void method(test1 t){
t.printaaa();
}
public void show(){
method(super::sey);//我是父亲
method(this::sey);//我子类
}
}
//类的构造器的引用
private static person buind(String name,int age,builder builder){
//接口功能获取个参数 建立对象
return builder.test2(name,age);
}
public static void main(String[] args) {
System.out.println( buind("王欢",12,person::new).toString());//person{name='王欢', age=12}
}
//数组构造器的引用
private static int[] binder(int l,test3 test3){
//接口的作用 接收一个参数(数组长度) 创建数组对象
return test3.num(l);
}
public static void main(String[] args) {
int[] binder = binder(12, int[]::new);
System.out.println(binder.length);//12
}
|