java - 使用 Java 8 的 Stream API,如何编写一个纯净的过滤函数?

标签 java functional-programming java-8 java-stream

如果我正在编写一个过滤器函数,我的过滤器依赖于一个外部变量。例如:

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 本身进行了变异。但这些是不同的示例。)

关于java - 使用 Java 8 的 Stream API,如何编写一个纯净的过滤函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003486/

相关文章:

java - 如何将 Instant 转换为 LocalTime?

Java arraylist问题(捕获?)

java - 使用 Hibernate Criteria API 查询与投影的多对一关系

dictionary - clojure 101 将向量组合成 map

javascript - Lodash fp(函数式编程)减少不工作我期望它如何工作

java - JavaFX ObservableList 或 ReactFX LiveList 的实时映射

java - libEGL 调用未实现的 OpenGL ES Api Android

java - 为什么 AbstractList,AbstractSet 做抽象而不是接口(interface)

javascript - 使用 Ramda 将键的值提升到顶层,同时保留对象的其余部分

java - 无法在不指定类型参数的情况下将 Java 8 方法与 lambda 参数一起使用