如何正确的在Java8中使用λ表达式

  介绍

如何正确的在Java8中使用λ表达式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

λ表达式,即带有参数的表达式,为了更清晰地理解λ表达式,先上代码:

<强> 1.1.1方式1 -匿名内部类

类学生
  私人字符串名称;
  私人双分数;
  公开学生(字符串名称、双分数){
  this.name=名称;
  这一点。分数=分数;
  }
  公共字符串getName () {
  返回名称;
  }
  公共双getScore () {
  返回分数;
  }
  公共空间setName(字符串名称){
  this.name=名称;
  }
  公共空间setScore(双分数){
  这一点。分数=分数;
  }
  @Override
  公共字符串toString () {
  返回“{”;
  +“\”,\“名称;:\““+名称+“\”;“
  +“,\“分数\“:\““+得分+“\”;“
  +“}”;
  }
  }:
  @Test
  公共空间test1 () {
  ListstudentList=new ArrayList () {
  {
  add(新学生(“stu1", 100.0));
  add(新学生(“stu2", 97.0));
  add(新学生(“stu3", 96.0));
  add(新学生(“stu4", 95.0));
  }
  };
  集合。排序(studentList新Comparator () {
  @Override
  公共int比较(学生o1、o2) {
  返回Double.compare (o1.getScore (), o2.getScore ());
  }
  });
  System.out.println (studentList);
  }

代码调用集合。方排序法对集合进行排序,其中第二个参数是一个匿名内部类,这种方法调用内部类中比较的方法对列表进行位置交换,因为java中的参数类型只能是类或者基本数据类型,所以虽然传入的是一个Comparator类,但是实际上可以理解成为了传递比较方法而不得不传递一个Comparator类,这种方式显得比较笨拙,而且大量使用的话代码严重冗余,这种情况在java8中通过使用λ表达式来解决。

λ表达式专门针对只有一个方法的接口(即函数式接口),比较器就是一个函数式接口

@FunctionalInterface   公共接口Comparator{   int比较(T o1、o2);   }

@FunctionalInterface的作用就是标识一个接口为函数式接口,此时比较器里只能有一个抽象方法,由编译器进行判定。

使用λ表达式之后方式1中的代码改造如下,

<强> 1.1.2方式2λ表达式

公共空testThread () {
  新线程(新Runnable () {
  @Override
  公共空间run () {
  System.out.println(“你好,我是线程!“);
  }
  }).start ();
  }

其中运行的接口也是一个函数式接口,源码如下

@FunctionalInterface   公共接口可运行{/* *   *当一个对象实现的接口& lt; code> Runnable使用   *创建一个线程,线程开始使对象# 39;s   * & lt; code> run</code>将被调用的方法分别执行   *线程。   * & lt; p>   *方法的总承包合同& lt; code> run是,它可能   *采取任何行动。   *   * @see java.lang.Thread # run ()   */公共抽象空运行();   }

将其转换为λ表达式的写法为

 @FunctionalInterface
  公共接口MyFunctionalInterface {
  公共空单(字符串味精);
  }/* *
  *需要单个参数
  */公共静态孔隙testOnePar (MyFunctionalInterface MyFunctionalInterface) {
  myFunctionalInterface.single (“msg");
  }/* *
  *一个参数,可以省略参数的括号
  */@Test
  公共空间testOneParameter () {
  testOnePar (x→System.out.println (x));
  }

如何正确的在Java8中使用λ表达式