java - 您将如何编写一个从列表中删除元素的“纯”函数?
问题描述
在 Java(或任何类似语言)中,您将如何编写从列表中删除元素的纯函数(或方法)。
如果元素在列表中,我们只需返回一个新的(理想情况下是不可变的)列表,其中包含输入列表的所有元素,减去我们删除的元素。
但是您将如何处理列表中未找到该元素的情况?
让我们假设该方法接收 2 个参数,list
以及element
要删除的参数:
public SOMETHING remove(final List<String> list, final String element){
// Copy the input list and remove the first occurrence of 'element', if I find it.
//
// if I don't find it ... do something clever here ...
}
如果我调用这个方法,并且element
不包含在里面list
:
- 抛出异常可能会使方法“不纯”(?)
- 修改输入列表并返回布尔值(类似于List#remove())可能会使方法“不纯”(修改输入将是副作用)
- 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
- 返回一个
Optional.of(listCopy)
(编辑:发布后添加到我的问题中) - 还有其他想法吗?
编辑
我应该提到我只想删除第一次出现的element
,所以如果输入list
中有多次出现element
,我不想通过一次调用我的 remove() 方法(例如使用stream().filter()
)来删除它们。我刚刚在我的代码示例中编辑了注释以反映这一点。但是,这与我的问题并不完全相关,因为我的主要问题围绕着如何使该方法直观地使用并保持“纯粹”。
编辑 2
我在上述建议中添加了一个额外的想法。ReturningOptional.of(listCopy)
似乎是迄今为止提出的解决方案中最优雅的解决方案。它强制调用者检查请求的操作是否成功,并且(如果成功),它返回一个新列表,从而不修改原始输入列表。如果操作不成功(element
未在里面找到list
),则方法返回Optional.empty()
。在我看来,这也将满足下面提到的引用完整性。
解决方案
通过你提到的几点:
- 抛出异常可能会使方法“不纯”(?)
- 如果您想返回相同的列表或抛出异常,这是一个实现决策。至于“纯函数”——只要你保持一致并且相同的输入产生相同的结果(或异常),你就很好
- 修改输入列表并返回一个布尔值(类似于 List#remove())可能会使方法“不纯”(修改输入将是一个副作用)
- 这将使其非纯功能性,因为您将产生副作用
- 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
- 实际上没有看到任何问题。再次,您的电话是否有效。就“纯功能”而言,您可以
至于实现,我认为流是最简单的,并返回新列表,所以你在纯度方面没问题
return list.stream()
.filter(e -> !e.equals(element))
.collect(Collectors.toList());
推荐阅读
- ios - 如何在 pdf 视图上移动/拖动多个视图?
- php - HTML DOM 使用循环将分页的 XML 文件合并为单个文件
- docker - Drupal 迁移到 Kubernetes
- xslt - 比较两个 xml 树节点并使用 xslt 查找具有值的节点是否存在于另一个中
- python-3.x - 如何在python中删除一系列打印的素数中的最后一个逗号?
- python - 在 doctest 中,有没有办法将 yaml 代码块视为变量?
- html - Flexbox 100% 高度,里面有可滚动的 div
- java - apache cxf 简单的 REST api 总是返回 404
- javascript - JavaScript:将像素位置添加到每个链接的 href
- json - 在 C# 中更新 Json 数组值