介绍
如何正确的在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中使用λ表达式