[英]With Java 8's Stream API, how can I write a filter function that is pure?
如果要编写过滤器函数,则取决于过滤器的外部变量。 例如:
public List<String> getMatches(String search) {
return stringList.stream().filter(str -> str.contains(search)).collect(Collectors.toList());
}
该过滤器取决于外部参数。 我只是想知道如果您事先不知道该如何使用纯函数编写过滤器。
这个lambda:
str -> str.contains(search)
是一个纯函数。
如果函数具有副作用,则它不是纯函数。 这不是。
然后是一个问题,即一个函数是否取决于某物……以及那意味着什么。
但是请考虑在此示例中实际发生的情况:
search
对象是String
,因此是不可变的。 因此,您无法通过使String
突变来“破坏”过滤器。
如果在lambda捕获到stream
变量的值之后能够更改其值,则会出现编译错误。
因此,“依赖”没有害处。
(如果search
是stringBuilder
,并且其他方式对其进行了变异,或者lambda本身进行了变异,则可能是有害的。但这是不同的示例。)
函数依赖于外部自身数据的事实并不仅仅使它不纯。
search
是一个字符串,它是不可变的。 这意味着它在创建后就无法修改,因此您不必担心它是副作用的“载体”。
创建严格“纯”的filter
版本也是不可能的。 filter
无法知道其过滤功能使用的数据是否不可变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.