繁体   English   中英

使用Java 8的Stream API,如何编写纯过滤器函数?

[英]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变量的值之后能够更改其值,则会出现编译错误。

因此,“依赖”没有害处。

(如果searchstringBuilder ,并且其他方式对其进行了变异,或者lambda本身进行了变异,则可能是有害的。但这是不同的示例。)

函数依赖于外部自身数据的事实并不仅仅使它不纯。

search是一个字符串,它是不可变的。 这意味着它在创建后就无法修改,因此您不必担心它是副作用的“载体”。

创建严格“纯”的filter版本也是不可能的。 filter无法知道其过滤功能使用的数据是否不可变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM