如何在lambdas foreach块中更改外部方法的局部变量? [英] How to change the local variable of the outer method in the lambdas foreach block?
本文介绍了如何在lambdas foreach块中更改外部方法的局部变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
不适用于每个区块:
public void cleanup4(){
long timestamp = Instant.now().minus(90l, ChronoUnit.DAYS)
.toEpochMilli();
String cql = "SELECT * FROM usertoken";
ResultSet rs = CassandraTools.getInstance().execute(cql,ConsistencyLevel.QUORUM);
CassandraConverter cassandraConverter=new MappingCassandraConverter();
CassandraConverterRowCallback<UserTokenCassandra> callback= new CassandraConverterRowCallback<UserTokenCassandra>(cassandraConverter, UserTokenCassandra.class);
UserTokenCassandra utc = null;
Iterator<Row> iterator = rs.iterator();
while (iterator.hasNext()) {
Row row = iterator.next();
utc=callback.doWith(row);
log.info("{}", utc);
log.info("记录的时间为:{}",
Instant.ofEpochMilli(utc.getExpireTime()));
if (timestamp > utc.getExpireTime()) {
// repository.delete(n);
}
}
}
For-each block:
For-each block:
public void cleanup4(){
long timestamp = Instant.now().minus(90l, ChronoUnit.DAYS)
.toEpochMilli();
String cql = "SELECT * FROM usertoken";
ResultSet rs = CassandraTools.getInstance().execute(cql,ConsistencyLevel.QUORUM);
CassandraConverter cassandraConverter=new MappingCassandraConverter();
CassandraConverterRowCallback<UserTokenCassandra> callback= new CassandraConverterRowCallback<UserTokenCassandra>(cassandraConverter, UserTokenCassandra.class);
rs.forEach(usertoken->{
UserTokenCassandra utc = null;
log.info("{}", utc);
log.info("The Time:{}",
Instant.ofEpochMilli(utc.getExpireTime()));
if (timestamp > utc.getExpireTime()) {
// repository.delete(utc);
}
});
}
1. for-each块似乎产生了很多没有使用UserTokenCassandra的引用..这些垃圾吗?
2.So如何编写此代码?
1.The for-each block seems generate a lot no use reference of UserTokenCassandra .. And are these garbage? 2.So How to write this code?
推荐答案
您无法在lambda体内修改外部方法局部变量。在这里,您不需要 forEach
。如 ResultSet
实现 Iterable
,您可以使用增强的代替
循环:
You cannot modify the outer method local variable from within the lambda body. Here you don't need the forEach
. As ResultSet
implements Iterable
, you can use enhanced for
loop instead:
for(Row row : rs) {
utc=callback.doWith(row);
log.info("{}", utc);
log.info("记录的时间为:{}",
Instant.ofEpochMilli(utc.getExpireTime()));
if (timestamp > utc.getExpireTime()) {
// repository.delete(n);
}
}
这篇关于如何在lambdas foreach块中更改外部方法的局部变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文