Java8提供了一系列我们可以使用lambda表达式实现的函数接口,允许将函数视为first-class citizen (作为参数传递,从方法返回,等等)。
示例:
Stream.of("Hello", "World").forEach(str->System.out.println(str));为什么被视为一等公民的功能如此重要?有什么例子可以证明这种力量吗?
发布于 2015-06-07 00:17:02
其思想是能够将行为作为参数进行传递。例如,在实现Strategy pattern时,这很有用。
Streams API是一个很好的例子,说明了将行为作为参数传递是如何有用的:
people.stream()
.map(person::name)
.map(name->new GraveStone(name, Rock.GRANITE)
.collect(Collectors.toSet())此外,它还允许程序员从函数式编程而不是面向对象编程的角度进行思考,这对于许多任务来说很方便,但在答案中涉及的内容相当广泛。
发布于 2015-06-07 00:31:21
我认为问题的第二部分已经得到了很好的解决。但我想试着回答第一个问题。
根据定义,一流的公民函数可以做更多的事情。一流的公民函数可以:
作为数据结构(例如,数组或列表)中的成员数据类型返回另一个变量的结果
这些都是“一流”的特权。
发布于 2015-06-07 00:27:08
这是一个表现力的问题。您不必这样做,但在许多实际情况下,它将使您的代码更具可读性和简洁性。例如,以您的代码为例:
public class Foo {
public static void main(String[] args) {
Stream.of("Hello", "World").forEach(str->System.out.println(str));
}
}并将其与我所能想到的最简洁的Java 7实现进行比较:
interface Procedure<T> {
void call(T arg);
}
class Util {
static <T> void forEach(Procedure<T> proc, T... elements) {
for (T el: elements) {
proc.call(el);
}
}
}
public class Foo {
static public void main(String[] args) {
Util.forEach(
new Procedure<String>() {
public void call(String str) { System.out.println(str); }
},
"Hello", "World"
);
}
}结果是一样的,行数少了一点:)还要注意的是,为了支持具有不同参数数量的Procedure实例,您需要一个接口,每个接口或者(更实际的)将所有参数作为一个Parameters对象传递。通过向Procedure实现添加一些字段,可以用类似的方式进行闭包。那是一大堆样板书。
事实上,像第一类的“函数器”和(不可变的)闭包已经使用anonymous classes很长一段时间了,但它们需要大量的实现工作。Lambda只是让事情变得更容易读和写(至少在大多数情况下)。
https://stackoverflow.com/questions/30684771
复制相似问题