gpt4 book ai didi

java - 你会如何编写一个 "pure"函数来从列表中删除一个元素?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:12 25 4
gpt4 key购买 nike

在 Java(或任何类似的语言)中,您将如何编写 Pure function (或方法)从列表中删除一个元素。

如果元素在列表中,我们只返回一个新的(理想情况下不可变的)列表,其中包含输入列表的所有元素,减去我们删除的元素。

但是如果列表中找不到该元素,您将如何处理?

假设该方法接收 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 中:

  • 抛出异常可能会使方法“不纯”(?)
  • 修改输入列表并返回一个 boolean 值(类似于 List#remove() )可能会使方法“不纯”(修改输入会产生副作用)
  • 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
  • 返回一个Optional.of(listCopy)(编辑:发布后添加到我的问题中)
  • 还有其他想法吗?

编辑

我应该提到我只想删除第一次出现的 element,所以如果输入 list 有多次出现的 element ,我不想通过调用我的 remove() 方法(例如使用 stream().filter())来删除它们。我刚刚编辑了我的代码示例中的注释以反射(reflect)这一点。然而,这与我的问题并不完全相关,因为我的主要问题围绕着如何使该方法直观易用并保持“纯粹”。

编辑 2

我在上面的建议中增加了一个额外的想法。返回 Optional.of(listCopy) 似乎是迄今为止所提出的解决方案中最优雅的解决方案。它强制调用者检查请求的操作是否成功,并且(如果成功)返回一个新列表,从而不修改原始输入列表。如果操作不成功(在 list 中找不到 element),该方法返回 Optional.empty()。在我看来,这也将满足下面提到的参照完整性

最佳答案

通过您提到的要点:

  1. 抛出异常可能会使方法“不纯”(?)
    • 这是一个实现决定,如果你想返回相同的列表或抛出异常。至于“纯函数”——只要你是一致的并且相同的输入产生相同的结果(或异常),你就很好
  2. 修改输入列表并返回一个 boolean 值(类似于 List#remove())可能会使方法“不纯”(修改输入会产生副作用)
    • 这将使它成为非纯函数式的,因为你会有副作用
  3. 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
    • 实际上没有发现任何问题。再次,你的电话,如果它是一个有效的场景。就“纯功能”而言,你在这里没问题

至于实现,我认为stream是最简单的,并且返回新列表,所以就纯度而言你没问题

return list.stream()
.filter(e -> !e.equals(element))
.collect(Collectors.toList());

关于java - 你会如何编写一个 "pure"函数来从列表中删除一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com