像几乎每个人一样,我仍在学习新的Java 8 Streams API的复杂性(并喜欢它们)。我对流的使用有疑问。我将提供一个简化的示例。
Java
Streams允许我们采用Collection
,并stream()
在其上使用方法来接收其所有元素的流。在这,有许多有用的方法,比如filter()
,map()
和forEach()
,这让我们对内容的使用拉姆达操作。
我有看起来像这样的代码(简化):
set.stream().filter(item -> item.qualify())
.map(item -> (Qualifier)item).forEach(item -> item.operate());
set.removeIf(item -> item.qualify());
这个想法是获取集合中与某个限定符匹配的所有项目的映射,然后对它们进行操作。手术后,它们不再有任何用途,应从原始设备中取出。该代码运行良好,但是我无法动摇Stream
单行中就可以为我完成此操作的感觉。
如果在Javadocs中,我可能会忽略它。
有谁更熟悉API,会看到类似的东西吗?
您可以这样做:
set.removeIf(item -> {
if (!item.qualify())
return false;
item.operate();
return true;
});
如果item.operate()
总是返回,true
您可以非常简洁地执行此操作。
set.removeIf(item -> item.qualify() && item.operate());
但是,我不喜欢这些方法,因为目前尚不清楚发生了什么。就个人而言,我将继续为此使用for
循环和Iterator
。
for (Iterator<Item> i = set.iterator(); i.hasNext();) {
Item item = i.next();
if (item.qualify()) {
item.operate();
i.remove();
}
}
如果是在Javadocs中,我可能会忽略它。 熟悉API的人会看到类似的东西吗?
问题内容: 我希望能够在迭代过程中从集合中删除多个元素。最初,我希望迭代器足够聪明,以使下面的幼稚解决方案能够正常工作。 但这会引发一个错误。 请注意,就我所知,iterator.remove()无法正常工作,因为我需要一次删除多个内容。还假设不可能确定“即时”删除哪些元素,但是可以编写该方法。在我的特定情况下,要确定要在迭代过程中删除的内容,将占用大量内存和处理时间。由于内存限制,也无法制作副本
问题内容: 我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,hibernate都会从解析表中删除该组,然后再次插入所有成员以及新成员。为什么不只是添加新的呢? 组中的注释: 员工的另一边 代码嗅探 下面是日志中报告的SQL 这种接缝的效率很低,并且会引起一些问题。如果有人提出要求将雇员添加到组中,则有些人将其改写。 诸如equals和h
问题内容: 我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,冬眠都会从解析表中删除该组,然后再次插入所有成员,再加上新成员。为什么不只是添加新的呢? 组中的注释: 员工的另一边 代码嗅探 下面是日志中报告的SQL 这种接缝的效率很低,并且会引起一些问题。如果有人提出将某员工添加到该组的要求,那么有些人将被改写。 诸如equals和has
在 TJS2 中,虽然字节串类似 Octet 类的对象,但实际上 Octet 类并不存在。 ( 但是如果对字节串进行 instanceof 运算则会返回 "Octet" )。 但是,如果使用对象的概念来讲,对于字节串有一系列可以使用的方法和属性。 字节串相关功能的实现尚未完成。 length length 方法将返回字节串的长度,请注意这个功能不是方法而是一个属性。但是,这个属性无法被赋值
在 TJS2 中,字符串被当作虚拟的 String 类的对象这样的东西,但是 String 类并不存在,实际上并没有 String 类的对象 ( 但是 对字符串使用 instanceof 运算符会返回 "String" )。 但是,可以把字符串当作对象,使用使用各种方法和属性。 length length 属性返回字符串的长度。请注意,这个不是方法,而是属性。但是,不能往这个属性中写入数值。