首页>新闻>太原Java培训班哪家实力强悍

太原Java培训班哪家实力强悍

来源:太原达内IT教育学校

时间:2021/5/6 15:35:01

太原Java培训班哪家实力强悍?小编在这里为大家推荐太原达内IT培训,17年专业IT培训机构,美国上市集团,开设IT培训班Java、python、大数据、linux、UI、会计等IT培训,覆盖IT培训和非IT培训共24大课程。达内集团凭借雄厚的技术研发实力、过硬的教学质量、成熟的就业服务团队,为学员提供强大的职业竞争力,在用人企业中树立了良好的口碑。欢迎大家的在线咨询,0元试听,随到随学,推荐就业。接下来小编为您分享,Java如何支持函数式编程?

   一个函数式接口只有一个抽象方法(singleabstractmethod);

   Object类中的publicabstractmethod不会被视为单一的抽象方法;

   函数式接口可以有默认方法和静态方法;

   函数式接口可以用@FunctionalInterface注解进行修饰。

   满足这些条件的interface,就可以被视为函数式接口。例如Java8中的Comparator接口:

   @FunctionalInterface

   publicinterfaceComparator<T>{

   /**

   *singleabstractmethod

   *@since1.8

   */

   intcompare(To1,To2);

   /**

   *Object类中的publicabstractmethod

   *@since1.8

   */

   booleanequals(Objectobj);

   /**

   *默认方法

   *@since1.8

   */

   defaultComparator<T>reversed(){

   returnCollections.reverseOrder(this);

   }

   /**

   *静态方法

   *@since1.8

   */

   publicstatic<TextendsComparable<?superT>>Comparator<T>reverseOrder(){

   returnCollections.reverseOrder();

   }

   //省略...

   }

   函数式接口有什么用呢?一句话,函数式接口带给我们的好处就是:可以使用极简的lambda表达式实例化接口。为什么这么说呢?我们或多或少使用过一些只有一个抽象方法的接口,比如Runnable、ActionListener、Comparator等等,比如我们要用Comparator实现排序算法,我们的处理方式通常无外乎两种:

   规规矩矩的写一个实现了Comparator接口的Java类去封装排序逻辑。若业务需要多种排序方式,那就得写多个类提供多种实现,而这些实现往往只需使用一次。

   另外一种聪明一些的做法无外乎就是在需要的地方搞个匿名内部类,比如:

   publicclassTest{

   publicstaticvoidmain(Stringargs[]){

   List<Person>persons=newArrayList<Person>();

   Collections.sort(persons,newComparator<Person>(){

   @Override

   publicintcompare(Persono1,Persono2){

   returnInteger.compareTo(o1.getAge(),o2.getAge());

   }

   });

   }

   }

   匿名内部类实现的代码量没有多到哪里去,结构也还算清晰。Comparator接口在Jdk1.8的实现增加了FunctionalInterface注解,代表Comparator是一个函数式接口,使用者可放心的通过lambda表达式来实例化。那我们来看看使用lambda表达式来new一个自定义比较器所需要编写的代码:

   Comparator<Person>comparator=(p1,p2)->Integer.compareTo(p1.getAge(),p2.getAge());

   ->前面的()是Comparator接口中compare方法的参数列表,->后面则是compare方法的方法体。

   下面将Java提供的Function、Predicate这两个函数接口的源码,摘抄如下:

   @FunctionalInterface

   publicinterfaceFunction<T,R>{

   Rapply(Tt);//只有这一个未实现的方法

   default<V>Function<V,R>compose(Function<?superV,?extendsT>before){

   Objects.requireNonNull(before);

   return(Vv)->apply(before.apply(v));

   }

   default<V>Function<T,V>andThen(Function<?superR,?extendsV>after){

   Objects.requireNonNull(after);

   return(Tt)->after.apply(apply(t));

   }

   static<T>Function<T,T>identity(){

   returnt->t;

   }

   }

   @FunctionalInterface

   publicinterfacePredicate<T>{

   booleantest(Tt);//只有这一个未实现的方法

   defaultPredicate<T>and(Predicate<?superT>other){

   Objects.requireNonNull(other);

   return(t)->test(t)&&other.test(t);

   }

   defaultPredicate<T>negate(){

   return(t)->!test(t);

   }

   defaultPredicate<T>or(Predicate<?superT>other){

   Objects.requireNonNull(other);

   return(t)->test(t)||other.test(t);

   }

   static<T>Predicate<T>isEqual(ObjecttargetRef){

   return(null==targetRef)

   ?Objects::isNull

   :object->targetRef.equals(object);

   }

   }

   @FunctionalInterface注解使用场景

   我们知道,一个接口只要满足只有一个抽象方法的条件,即可以当成函数式接口使用,有没有@FunctionalInterface都无所谓。但是jdk定义了这个注解肯定是有原因的,对于开发者,该注解的使用一定要三思而后续行。

   如果使用了此注解,再往接口中新增抽象方法,编译器就会报错,编译不通过。换句话说,@FunctionalInterface就是一个承诺,承诺该接口世世代代都只会存在这一个抽象方法。因此,凡是使用了这个注解的接口,开发者可放心大胆的使用Lambda来实例化。当然误用@FunctionalInterface带来的后果也是极其惨重的:如果哪天你把这个注解去掉,再加一个抽象方法,则所有使用Lambda实例化该接口的客户端代码将全部编译错误。

   特别地,当某接口只有一个抽象方法,但没有用@FunctionalInterface注解修饰时,则代表别人没有承诺该接口未来不增加抽象方法,所以建议不要用Lambda来实例化,还是老老实实的用以前的方式比较稳妥。

   小结

   函数式编程更符合数学上函数映射的思想。具体到编程语言层面,我们可以使用Lambda表达式来编写函数映射,函数之间通过链式调用连接到一起,完成所需业务逻辑。Java的Lambda表达式是后来才引入的,由于函数式编程在并行处理方面的优势,正在被大量应用在大数据计算领域。

温馨提示:为了不影响您的时间,来校区前或者遇到不明白的问题请先电话咨询,方便我校安排相关课程的专业老师为您解答,选取适合您的课程。以上是太原达内教育的小编为您分享的关于Java如何支持函数式编程的内容,希望可以为同学们提供帮助,更多Java资讯请持续关注太原达内教育。

  • 上一篇:太原Java暑期培训班有哪些
  • 下一篇:太原Java学费一般多少钱
  • 相关推荐 更多>

    太原精选几大Java培训机构人气...

    太原十大UI设计师培训机构今日重...

    太原python培训机构哪家值得...

    太原python培训中心哪个好

    太原UI设计培训机构哪家好

    太原web基础差学习课程哪好

    预约体验课

    版权所有:搜学搜课(www.soxsok.com)

  • 在线咨询
  • 电话咨询
  • 预约试听

  • ;