Java 8和流上的聚合操作

时间:2013-12-12 08:52:32

标签: java lambda java-8

当我们使用filtermapToIntsum等方法时 传递给他们lambda表达式我不明白是否操作 方法本身或是我们传递的lambda。

我想知道正确的术语。

我认为lambda是函数,因此我们传递给它的操作 用它来产生结果的方法。

为什么还说filtersum等是使用函数的操作 他们的论点?

这两个都是正确的术语吗?

4 个答案:

答案 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