如何在lambdas foreach块中更改外部方法的局部变量? [英] How to change the local variable of the outer method in the lambdas foreach block?

查看:392
本文介绍了如何在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆