Stream流
stream流的作用:
- 针对集合进行功能简化开发
- stream流通常需要和Lambda表达式一起使用
stream流的思想:
stream流的三类方法
获取Stream流
- 单列集合
- 可以使用Collection接口中的默认方法stream()获取
- default Stream< E > stream()
- 双列集合
- 间接的生成流
- 可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
- 数组
- 多个同一类型的元素
- 使用Stream流中的静态方法of,可以把多个同一种类型的元素封装成Stream流对象
- static< T > Stream< T > of(T… values)
中间方法
方法 | 解释 |
---|
Stream< T > filter(Predicate predicate) | 用于对流中的数据进行过滤 |
Stream< T > limit(long maxSize) | 截取指定参数个数的数据 |
Stream< T > skip(long n) | 跳过指定参数个数的数据 |
static< T > Stream< T > concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream< T > distinct() | 去除流中重复的元素,依赖(hashCode和equals方法) |
< R > Stream < R > map(Function< ? super T, ? extends R > mapper) | 将流中的元素类型进行转换 |
Stream< T > sorted() | 将流中元素按照自然排序的规则排序 |
Stream< T > sorted(Comparator< ? super T > comparator) | 将流中元素按照自定义比较器规则排序 |
终结方法
方法 | 解释 |
---|
void forEach(Consumer action) | 对此流的每个元素执行操作 |
Optional< T > min(Comparator< ? super T > comparator) | 根据提供的Comparator返回此流的最小值 |
Optional< T > max(Comparator< ? super T > comparator) | 根据提供的Comparator返回此流的最大值 |
long count() | 返回此流中的元素数 |
注意:在流对象使用了终结方法后,就表示流关闭了(无法继续使用)
Stream流的收集操作
Stream流的收集方法
方法 | 解释 |
---|
R collect(Collector collector) | 此方法只负责收集流中的数据,创建集合添加数据动作需要依赖于参数 |
< A > A[] toArray(IntFunction < A > generator) | 把Stream流中的数据存储到指定类型的数组中并返回 |
工具类Collectors提供了具体的收集方式
方法 | 解释 |
---|
public static < T > Collector toList() | 把元素收集到List集合中 |
public static < T > Collector toSet() | 把元素收集到Set集合中 |
public static < T > Collector toMap(Function keyMapper, Function valueMapper) | 把元素收集到Map集合中 |
综合案例练习
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
public class Demo1 {
public static void main(String[] args) {
ArrayList<String> al1 = new ArrayList<>();
ArrayList<String> al2 = new ArrayList<>();
ArrayList<Person> personArr = new ArrayList<>();
Collections.addAll(al1, "悄悄那", "看看类", "明明", "贝贝仙", "乐乐妈", "牛牛");
Collections.addAll(al2, "张三丰", "张利豪", "贝尔", "雷霆", "张宇", "芊芊");
Stream<String> stream1 = al1.stream();
Stream<String> rel1 = stream1.filter(name -> name.length() == 3).limit(3);
Stream<String> stream2 = al2.stream();
Stream<String> rel2 = stream2.filter(name -> name.startsWith("张")).skip(2);
Stream<String> result = Stream.concat(rel1, rel2);
Stream<Person> personStream = result.map(obj -> new Person(obj));
List<Person> list = personStream.collect(Collectors.toList());
System.out.println(list.toString());
}
}
Optional类
介绍
- 可能包含或不包含非空值的容器对象。如果一个值存在,isPresent()将返回true和get()将返回值
- 使用Optional可以简化非空判断操作
Optional类常用的功能
方法 | 解释 |
---|
public static < T > Optional < T > of(T value) | 通过非null值构建一个Optional容器,注意value不能不为null否则抛出异常 |
public static < T > Optional < T > ofNullable(T value) | 通过指定值构建一个Optional容器,如果值为null则返回Optional.empty |
public T orElse(T other) | 返回值如果存在,否则返回other |
public boolean isPresent() | 如果存在值,则返回true,否则为false |
public T get() | 如果Optional中存在值,则返回值,否则抛出NoSuchElementExcetion |