首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8中的函数式编程

Java 8中的函数式编程
EN

Stack Overflow用户
提问于 2018-01-22 20:55:10
回答 1查看 291关注 0票数 1

据我所知,函数式编程意味着提供不同的行为实现接口。这会比我创建一个新的类并在其中实现那个接口更好吗?我不清楚这一点

代码语言:javascript
复制
interface worldGreeting {
 String processName(String str);
}
public class ReadJson {

public static void main(String[] argv) throws Exception {
    worldGreeting morningGreeting = (str) -> "Good Morning " + str + "!";
    worldGreeting eveningGreeting = (str) -> "Good Evening " + str + "!";
    System.out.println(morningGreeting.processName("Waseem"));
    System.out.println(eveningGreeting.processName("Saeed"));
}

}

第二种方法是这样的

代码语言:javascript
复制
class Moring implements worldGreeting{
@Override
public String processName(String str) {
    return "Good Morning " + str + "!";
  }
  }

 class Evening implements worldGreeting{

@Override
public String processName(String str) {
    return "Good Evening " + str + "!";
  }
 }
EN

回答 1

Stack Overflow用户

发布于 2018-01-23 13:40:49

单一抽象方法表示法和匿名接口实现之间的区别无关紧要,因此在我的代码示例中,我更倾向于使用匿名接口实现。

考虑这两种不同的方式来提供类似的功能:

版本1:类型级继承

代码语言:javascript
复制
interface Greeter {
    abstract String greet(String name);
}
class MorningGreeter implements Greeter {
    @Override public String greet(String name) {
        return "Good morning, " + name + "!";
    }
}
class EveningGreeter implements Greeter {
    @Override public String greet(String name) {
        return "Good evening, " + name + "!";
    }
}

版本2:匿名实现

代码语言:javascript
复制
interface Greeter {
    abstract String greet(String name);
    static Greeter morningGreeter = new Greeter() {
        @Override public String greet(String name) {
            return "Good morning, " + name + "!";
        }
    };
    static Greeter eveningGreeter = new Greeter() {
        @Override public String greet(String name) {
            return "Good evening, " + name + "!";
        }
    };
}

有哪些不同之处?版本1增加了三个类型级抽象,而版本2只增加了一个。此外,版本1允许实例化任意数量的MorningGreeterEveningGreeter,而版本2的编写使得恰好只有一个morningGreeter和一个eveningGreeter

出于几个原因,我更喜欢版本2。

首先,没有理由创建多个MorningGreeter实例,因为任何两个实例的功能都无法相互区分:唯一的区别是它们的内存地址。我试着只为那些我会多次实例化并且具有不同属性的东西创建类。

其次,我个人认为MorningGreeterEveningGreeter不应该是它们自己的类型级抽象,因为它们不会向Greeter添加任何方法或字段。我试图通过它们所支持的方法和字段来限制我的类型级抽象,因为类型系统的目的是防止您对可能不支持它的对象调用错误的方法,而Greeter是只有一个带有签名String greet(String name)的方法的对象的类型级抽象。我不认为用完全相同的方法创建两个新的类型级抽象有多大价值。

第三,版本2为这个(非常简单的)库的用户提供了一个明确的入口点。在版本1中,用户需要grep "implements Greeter“的所有项目文件,或者使用集成开发环境的魔术跳转到实现类。在版本2中,用户只需使用两种静态方便方法中的任何一种来创建问候语。

我希望这能回答你的问题。我认为这是一个好问题,不仅仅是个人品味的问题。

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

https://stackoverflow.com/questions/48382102

复制
相关文章

相似问题

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