当我们使用filter
,mapToInt
,sum
等方法时
传递给他们lambda表达式我不明白是否操作
方法本身或是我们传递的lambda。
我想知道正确的术语。
我认为lambda是函数,因此我们传递给它的操作 用它来产生结果的方法。
为什么还说filter
,sum
等是使用函数的操作
他们的论点?
这两个都是正确的术语吗?
答案 0 :(得分:5)
从广义上讲,Stream方法和它们接受的lambda参数都是操作。一旦我们习惯了方法调用的参数可以是函数的想法,这并不会让人感到困惑。 Stream方法将其赋予的函数应用于其流中的值,以生成新流(中间方法)或生成一些聚合结果(终端方法)。
有关更详细的说明,请参阅http://www.lambdafaq.org/why-are-lambda-expressions-being-added-to-java/
答案 1 :(得分:1)
不确定这是否被普遍接受,但我认为是这样的:
函数是接收参数并生成值的函数,理想情况下没有副作用(但是,这在Java中是不可执行的)。如果你想强调数学/功能方面,请使用它。
子程序/过程是一段经过命名的代码,可以重复使用它的副作用。
方法是如何用Java实现/编写函数和子例程。没有函数或过程不属于某个类。
Java中的lambda表达式是一种在运行中编写方法(某些匿名类恰好实现功能接口)的方法,同时获得对所述接口实例的引用。
操作是一种功能或程序。
所以,取决于你想看它的方式:因为它是关于Java的,所以你可以把所有东西称为“方法”。但有时你想强调不同的方面。就像在你的例子中一样:
filter,sum等是使用函数作为参数的操作
在这里,我们可以说:“filter
是一个将函数接口引用为参数的方法”,但这会以某种方式改变句子的意图。
答案 2 :(得分:1)
Lambda是一个函数/回调函数,通常作为参数传递。理解这一点的方法,考虑您需要在列表中搜索值:
Java 7:
int i = Arrays.asList(1,2,3,4,5,6).indexOf(3);
这将提供单个元素。现在发生了什么,当需要更动态的请求时 - 他可以用for循环收集这些项目。但如果他想以类似的方式做到这一点,他可以传递一个lambda作为一个论点:
Java 8(可能如何):
List<Integer> collect = asList(1, 2, 3, 4, 5, 6).filter(x -> x >= 2 && x < 4);
真正的Java 8 API示例有点冗长:
List<Integer> collect = Arrays.asList(1, 2, 3, 4, 5, 6)
.stream()
.filter(x -> x >= 2 && x < 4)
.collect(Collectors.toList());
答案 3 :(得分:0)
记住, 我们传递给过滤器的是函数只是一个过滤逻辑。虽然过滤器功能已经期望具有过滤逻辑的功能。 Filter函数专门接受一个返回boolean的函数,并决定是传递流中的当前元素还是简单地丢弃它。
我希望我能正确理解你的问题。 有关流的更多信息,请参阅Java 8 Stream API上的一系列文章 amitph.com > Java 8 Streams API Tutorials