java stream 学习笔记

流(Stream)仅仅代表着数据流,并没有数据结构,所以他遍历完一次之后便再也无法遍历(这点在编程时候需要注意,不像Collection,遍历多少次里面都还有数据),它的来源可以是Collection、array、io等等。

中间与终点方法

流”抽象天生就该是持续的,中间方法永远返回的是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()出来的对象。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值