主要内容
- Stream流
- 方法引用
1 Stream流
JDK1.8+出现,关注做什么,而不是怎么做
1.1 流程式思想
- 对一组数据进行多过滤,筛选,统计…
- Stream流并不会存储元素,流对象只能被消费一次
- 只能内部迭代遍历
- Stream流是一个来自数据源的元素队列并支持聚合操作
- 数据源:可以是集合或数组等等.
1.2 获取流
Collection集合都可以通过stream默认方法获取流 List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); Stream接口静态方法of可以获取数组对应的流 String[] array = { "张无忌", "张翠山", "张三丰", "张一元" }; Stream<String> stream = Stream.of(array);
of方法的参数是一个可变参数,所以支持数组
1.3 常用方法
- 延迟方法:返回值类型仍然是Stream自身,支持链式调用
过滤:fiter Stream<T> filter(Predicate<? super T> predicate) 映射(转换):map <R> Stream<R> map(Function<? super T, ? extends R> mapper); 取用前几个:limit Stream<T> limit(long maxSize); 跳过前几个:skip Stream<T> skip(long n); 组合:concat static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b)
- 终结方法:返回值不再是Stream,不支持链式,相当于流水线的开关。
遍历:forEach void forEach(Consumer<? super T> action) 统计个数:count long count();
- 扩展
将元素存储到数组 String[] str = Stream.of().toArray(String[]::new) 将元素存储到集合 List<T> list = Stream.of().collect(Collectors.toList());
2 方法引用
- 如果Lambda表达式仅仅是调用一个已经存在的方法, 那就可以通过方法引用来替代Lambda表达式
作用
::简化Lambda表达式
::
:方法引用运算符, 它所在的表达式被称为方法引用- Lambda表达式写法:
(String s) -> System.out.println(s)
参数传递给System.out.println()方法去打印- 方法引用写法:
System.out::println
用System.out.println()方法中代码, 来作为Lambda中重写方法的实现方式
注意:
Lambda中传递的参数一定是方法引用中的那个方法可以接收的类型,否则会抛出异常
方法引用能简化以下场景: (方法名后不要写小括号)
- 通过对象名引用成员方法
对象名::成员方法名
System.out::println- 通过类名引用静态方法
类名::静态方法名
i -> Math.abs(i)
Math::abs- 通过super引用父类成员方法
super::父类方法名
()->super.eat();
super::eat- 通过this引用本类成员方法
this::本类方法名
()->this.eat();
this::eat- 引用某个类的构造方法
类名::new
name->new Person(name)
Person::new- 引用创建数组的方法
数据类型[]::new
length->new int[length];
int[]::new