首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么被视为一等公民的功能如此重要?

为什么被视为一等公民的功能如此重要?
EN

Stack Overflow用户
提问于 2015-06-06 23:52:00
回答 4查看 472关注 0票数 0

Java8提供了一系列我们可以使用lambda表达式实现的函数接口,允许将函数视为first-class citizen (作为参数传递,从方法返回,等等)。

示例:

代码语言:javascript
复制
Stream.of("Hello", "World").forEach(str->System.out.println(str));

为什么被视为一等公民的功能如此重要?有什么例子可以证明这种力量吗?

EN

回答 4

Stack Overflow用户

发布于 2015-06-07 00:17:02

其思想是能够将行为作为参数进行传递。例如,在实现Strategy pattern时,这很有用。

Streams API是一个很好的例子,说明了将行为作为参数传递是如何有用的:

代码语言:javascript
复制
people.stream()
  .map(person::name)
  .map(name->new GraveStone(name, Rock.GRANITE)
  .collect(Collectors.toSet())

此外,它还允许程序员从函数式编程而不是面向对象编程的角度进行思考,这对于许多任务来说很方便,但在答案中涉及的内容相当广泛。

票数 4
EN

Stack Overflow用户

发布于 2015-06-07 00:31:21

我认为问题的第二部分已经得到了很好的解决。但我想试着回答第一个问题。

根据定义,一流的公民函数可以做更多的事情。一流的公民函数可以:

  1. be function
  2. participate by variables
  3. be passed as arguments
  4. be

作为数据结构(例如,数组或列表)中的成员数据类型返回另一个变量的结果

这些都是“一流”的特权。

票数 3
EN

Stack Overflow用户

发布于 2015-06-07 00:27:08

这是一个表现力的问题。您不必这样做,但在许多实际情况下,它将使您的代码更具可读性和简洁性。例如,以您的代码为例:

代码语言:javascript
复制
public class Foo {
    public static void main(String[] args) {
        Stream.of("Hello", "World").forEach(str->System.out.println(str));
    }
}

并将其与我所能想到的最简洁的Java 7实现进行比较:

代码语言:javascript
复制
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只是让事情变得更容易读和写(至少在大多数情况下)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30684771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档