当前位置: 首页 > 面试题库 >

Java 8 Streams可以对集合中的项目进行操作,然后将其删除吗?

宰父俊民
2023-03-14
问题内容

像几乎每个人一样,我仍在学习新的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 属性返回字符串的长度。请注意,这个不是方法,而是属性。但是,不能往这个属性中写入数值。