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

sro*_*ley 1 java functional-programming java-8 java-stream

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

public List<String> getMatches(String search) {
    return stringList.stream().filter(str -> str.contains(search)).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

此过滤器取决于外部参数.我只是想知道如果你事先不知道标准,如何使用纯函数编写过滤器.

Ste*_*n C 7

这个lambda:

    str -> str.contains(search)
Run Code Online (Sandbox Code Playgroud)

一个纯粹的功能.

如果它执行副作用,则函数不纯.这个没有.


那么问题是函数是否依赖于某些东西......以及这意味着什么.

但请考虑这个例子中实际发生的事情:

  • search对象是一个String因此是不可变的.所以你不能通过改变来"破坏"过滤器String.

  • 如果stream在lambda捕获其值后能够更改变量的值,则会出现编译错误.

所以,"依赖"并没有坏处.

(如果search是a stringBuilder,它可能是有害的,并且其他东西也会发生变异.或者如果lambda本身进行了变异.但这些是不同的例子.)