流(Stream)仅仅代表着数据流,并没有数据结构,所以他遍历完一次之后便再也无法遍历(这点在编程时候需要注意,不像Collection,遍历多少次里面都还有数据),它的来源可以是Collection、array、io等等。
filter是stream接口中最常用的方法,顾名思义,filter方法就是一个过滤方法,支持lambda表达式。
中间与终点方法
流”抽象天生就该是持续的,中间方法永远返回的是Stream,因此如果我们要获取最终结果的话,必须使用终点操作才能收集流产生的最终结果。
例子如下:
int sum = transactions.stream().
filter(t -> t.getBuyer().getCity().equals(“London”)).
mapToInt(Transaction::getPrice).
sum();
filter是stream接口中最常用的方法,顾名思义,filter方法就是一个过滤方法,支持lambda表达式。
map是可以实现对象转换。
sum是一个流的终点方法,返回最终统计结果。
流(stream)的优点:
未使用lambda表达式时的例子:
String direction = gpsData.getPosition().getLatitude().getDirection();
这样的方法很容易出现空指针的异常。
改进的代码:
String direction = “UNKNOWN”;
if (gpsData != null) {
Position p = gpsData.getPosition();
if (p != null) {
Latitude latitude = p.getLatitude();
if (latitude != null) {
direction = latitude.getDirection();
}
}
}
这样做代码会变得非常臃肿。
使用lambda表达式改进代码:
Optional<GPSData> maybeGPS = Optional.ofNullable(gpsData);
maybeGPS.ifPresent(GPSData::printPosition);
GPSData gps = maybeGPS.orElse(new GPSData());
maybeGPS.filter(g -> g.lastRead() < 2).ifPresent(GPSData.display());
Optional是用来封装对象的,其中有of() 和 ofNullable() 两个方法,使用of()时 对象不能为空,为空时会抛异常,ofNullable()封装的对象可以为空。
isPresent()方法可以传入lambda表达式,gpsData为空时,不执行printPosition()方法。
orElse()方法是一个替换的方法,如果原先的gpsData为空时,maybeGPS封装的对象就等于新new()出来的对象。