ResultSet rs = stmt.executeQuery();
List<String> userIdList = new ArrayList<String>();
while(rs.next()){
userIdList.add(rs.getString(1));
}
我可以使用Java streams/lambda表达式来执行这个迭代,而不是使用while循环来填充列表吗?
您可以为resultset
创建一个包装器,使其成为可迭代的。从那里,您可以迭代并创建流。当然,您必须定义一个映射器函数来从结果集中获取迭代的值。
resultsetiterable
可能如下所示
public class ResultSetIterable<T> implements Iterable<T> {
private final ResultSet rs;
private final Function<ResultSet, T> onNext;
public ResultSetIterable(ResultSet rs, CheckedFunction<ResultSet, T> onNext){
this.rs = rs;
//onNext is the mapper function to get the values from the resultSet
this.onNext = onNext;
}
private boolean resultSetHasNext(){
try {
hasNext = rs.next();
} catch (SQLException e) {
//you should add proper exception handling here
throw new RuntimeException(e);
}
}
@Override
public Iterator<T> iterator() {
try {
return new Iterator<T>() {
//the iterator state is initialized by calling next() to
//know whether there are elements to iterate
boolean hasNext = resultSetHasNext();
@Override
public boolean hasNext() {
return hasNext;
}
@Override
public T next() {
T result = onNext.apply(rs);
//after each get, we need to update the hasNext info
hasNext = resultSetHasNext();
return result;
}
};
} catch (Exception e) {
//you should add proper exception handling here
throw new RuntimeException(e);
}
}
//adding stream support based on an iteratable is easy
public Stream<T> stream() {
return StreamSupport.stream(this.spliterator(), false);
}
}
现在我们有了包装器,您可以通过流式传输结果:
ResultSet rs = stmt.executeQuery();
List<String> userIdList = new ResultSetIterable(rs, rs -> rs.getString(1)).stream()
.collect(Collectors.toList())
public interface CheckedFunction<T,R> extends Function<T,R> {
@Override
default R apply(T t) {
try {
return applyAndThrow(t);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
R applyAndThrow(T t) throws Exception;
}
问题内容: 我有一个用ResultSet作为数据成员实现Iterator的类。本质上,该类如下所示: 我如何检查ResultSet是否有另一行,所以由于ResultSet本身未定义hasNext,因此可以创建有效的hasNext方法?我当时在想查询以获取计数并管理该数字以查看是否还有另一行,但我想避免这种情况。 问题答案: 这是一个坏主意。这种方法要求连接一直保持打开状态,直到读取最后一行为止,并
问题内容: 有没有一种方法来获取数组的迭代器?像这样: 问题答案: 您可以使用: 它只是将数组包装在列表实现中,以便您可以在其上调用方法。 请注意,这种方法仅适用于对象数组。对于原始数组,您将必须实现自己的迭代器(例如,使用匿名类)。 从Java 8开始,您还可以使用开箱即用的迭代器(并且如果是或,也可以使此代码进行编译: 尽管您将无法使用原始数据类型,并且因为没有相应的流实现。但是,您可以使用以
问题内容: 我从网络服务器获取以下JSON字符串。 我想要公开HTML中的JSON,我尝试了以下操作,但未填写字段,我也收到了“无异常”,因此我很难找出其不起作用的原因。 TS 的HTML 问题答案: 您可以使用来从对象获取键(需要IE AFAIK中的polyfill)
问题内容: 我正在尝试遍历: …并提取中的每个元素。这是我的方法: 这里的问题是对的每次调用都会从中删除元素,从而修改其大小,从而导致以下错误: 那么…当元素动态变化时,我该如何遍历其中的元素呢? 问题答案: 其他人则提到了正确的解决方案,而没有实际阐明。所以这里是: 另外,如果您想安全地在assign函数中更改映射,则需要传入迭代器(只能使用remove函数,并且只能使用一次)或条目来更改值。
问题内容: 我正在尝试迭代由numpy.linspace生成的值的数组: 这段代码在我的办公室计算机上工作正常,但是今天早上我坐下来在另一台机器上在家工作,出现了此错误: 只是一个浮点数数组,脚本在打印内容时没有问题-只是显然对它们进行了迭代。关于导致它损坏的原因的任何建议以及可能的解决方法? 问题答案: 给您一维NumPy数组。例如: 因此: 无法工作。您将需要某种二维数组,在第二维中具有两个元
问题内容: 我正在尝试运行一个for循环。这是我遇到问题的代码部分: 因此,我的目的是遍历aldurstengd_ororka,对于字典中的每个“年龄”元组,我为元组中的每个“项目”运行另一个for循环。我得到的错误是 TypeError:“ int”对象不可迭代 问题答案: 如果是字典,则此表达式: 是一个错误。也许您的意思是: 编辑:您看到的错误是非常有趣的,我确实使用此代码段重现了它: 代码