ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java8中功能接口的用途

2019-10-06 23:03:30  阅读:253  来源: 互联网

标签:functional-interface java java-8


关于Java8内置功能接口,我遇到过很多问题,包括this,this,thisthis.但是所有人都在问“为什么只有一种方法?”或“如果我使用我的功能界面执行X,为什么会出现编译错误”等等.我的问题是:当我在自己的界面中使用lambda时,这些新功能接口的存在目的是什么?

请考虑以下oracle documentation中的示例代码:

    // Approach 6: print using a predicate
     public static void printPersonsWithPredicate(List<Person> roster, 
                                                  Predicate<Person> tester) {
            for (Person p : roster) {
                if (tester.test(p)) {
                   System.out.println(p);
                }
            }
        }

好的,很好,但这可以用上面的自己的例子来实现(一个单一方法的接口并不新鲜):

      // Approach 5: 
        public static void printPersons(<Person> roster, 
                                        CheckPerson tester) {
            for (Person p : roster) {
                if (tester.test(p)) {
                   System.out.println(p);
                }
            }
        }


  interface CheckPerson {
        boolean test(Person p);
    }

我可以将lambda传递给两个方法.

第一种方法为我节省了一个自定义界是这个吗?

或者这些标准功能接口(消费者,供应商,谓词,功能)是否可以作为代码组织,可读性,结构,[其他]的模板?

解决方法:

显然,您可以跳过使用这些新界面,并使用更好的名称滚动自己的界面.但有一些注意事项:

>除非您的自定义接口扩展了其中一个内置函数,否则您将无法在其他JDK API中使用自定义接口.
>如果你总是自己动手,在某些时候你会遇到一个你不能想到一个好名字的情况.例如,我认为CheckPerson的目的并不是一个好名字,尽管这是主观的.

大多数内置接口还定义了一些其他API.例如,谓词定义或(谓词),和(谓词)和否定().

函数定义了andThen(Function)和compose(Function)等.

它不是特别令人兴奋,直到它:在函数上使用除抽象之外的方法允许更容易的组合,策略选择等等,例如(使用this article中建议的样式):

之前:

class PersonPredicate {
  public Predicate<Person> isAdultMale() {
    return p -> 
            p.getAge() > ADULT
            && p.getSex() == SexEnum.MALE;
  }
}

可能只是成为这个,最终可以重复使用:

class PersonPredicate {
  public Predicate<Person> isAdultMale() {
    return isAdult().and(isMale());
  }

  publci Predicate<Person> isAdultFemale() {
    return isAdult().and(isFemale());
  }

  public Predicate<Person> isAdult() {
    return p -> p.getAge() > ADULT;
  }

  public Predicate<Person> isMale() {
    return isSex(SexEnum.MALE);
  }
  public Predicate<Person> isFemale() {
    return isSex(SexEnum.FEMALE);
  }
  public Predicate<Person> isSex(SexEnum sex) {
    return p -> p.getSex() == sex;
  }
}

标签:functional-interface,java,java-8
来源: https://codeday.me/bug/20191006/1862887.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有