How to change the local variable of the outer method in the lambdas foreach block?

倖福魔咒の 提交于 2019-12-23 06:31:31

问题


Not 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);
    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:

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.The for-each block seems generate a lot no use reference of UserTokenCassandra .. And are these garbage? 2.So How to write this code?


回答1:


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);
    }
}


来源:https://stackoverflow.com/questions/32561029/how-to-change-the-local-variable-of-the-outer-method-in-the-lambdas-foreach-bloc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!