`

Java 8特性探究(1):通往lambda之路_语法篇

    博客分类:
  • J2SE
 
阅读更多

文章源自:http://developer.51cto.com/art/201404/435591.htm

函数式接口

函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。

Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现,下面讲到语法会讲到

Lambda语法

包含三个部分

一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数

一个箭头符号:->

方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}

总体看起来像这样

(parameters) -> expression 或者 (parameters) -> { statements; }

看一个完整的例子,方便理解

/** 
 * 测试lambda表达式 
 * 
 * @author benhail 
 */ 
public class TestLambda { 
 
    public static void runThreadUseLambda() { 
        //Runnable是一个函数接口,只包含了有个无参数的,返回void的run方法; 
        //所以lambda表达式左边没有参数,右边也没有return,只是单纯的打印一句话 
        new Thread(() ->System.out.println("lambda实现的线程")).start();  
    } 
 
    public static void runThreadUseInnerClass() { 
        //这种方式就不多讲了,以前旧版本比较常见的做法 
        new Thread(new Runnable() { 
            @Override 
            public void run() { 
                System.out.println("内部类实现的线程"); 
            } 
        }).start(); 
    } 
 
    public static void main(String[] args) { 
        TestLambda.runThreadUseLambda(); 
        TestLambda.runThreadUseInnerClass(); 
    } 
}

可以看出,使用lambda表达式设计的代码会更加简洁,而且还可读。

方法引用

其实是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,语法也很简单,左边是容器(可以是类名,实例名),中间是"::",右边是相应的方法名。如下所示:

 

ObjectReference::methodName

 

一般方法的引用格式是

  1. 如果是静态方法,则是ClassName::methodName。如 Object ::equals
  2. 如果是实例方法,则是Instance::methodName。如Object obj=new Object();obj::equals;
  3. 构造函数.则是ClassName::new

再来看一个完整的例子,方便理解

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
 
/** 
 * 
 * @author benhail 
 */ 
public class TestMethodReference { 
 
    public static void main(String[] args) { 
 
        JFrame frame = new JFrame(); 
        frame.setLayout(new FlowLayout()); 
        frame.setVisible(true); 
         
        JButton button1 = new JButton("点我!"); 
        JButton button2 = new JButton("也点我!"); 
         
        frame.getContentPane().add(button1); 
        frame.getContentPane().add(button2); 
        //这里addActionListener方法的参数是ActionListener,是一个函数式接口 
        //使用lambda表达式方式 
        button1.addActionListener(e -> { System.out.println("这里是Lambda实现方式"); }); 
        //使用方法引用方式 
        button2.addActionListener(TestMethodReference::doSomething); 
         
    } 
    /** 
     * 这里是函数式接口ActionListener的实现方法 
     * @param e  
     */ 
    public static void doSomething(ActionEvent e) { 
         
        System.out.println("这里是方法引用实现方式"); 
         
    } 
}

 可以看出,doSomething方法就是lambda表达式的实现,这样的好处就是,如果你觉得lambda的方法体会很长,影响代码可读性,方法引用就是个解决办法.

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java8语法详解_Java8_java_java8语法::_源码

    在本篇文章中,我们将深入探讨Java 8中的关键语法改进,包括函数式编程、Lambda表达式、Stream API、日期与时间API、默认方法以及方法引用来帮助你更好地理解和应用这些新特性。 1. **Lambda表达式**: Lambda...

    java8源码-java8-sample:该项目仅用于学习java8

    通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...

    Java8新特性之lambda的作用_动力节点Java学院

    Java8新特性之lambda的作用_动力节点Java学院,动力节点口口相传的Java黄埔军校

    java8源码-javase8-sample:javase8-sample.git

    通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...

    java8源码-javase8-sample:javase8-sample

    通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...

    Java系列JDK 1.8 新特性之 Lambda表达式.pdf

    ### Java系列JDK 1.8 新特性之 Lambda表达式 #### 1、Lambda表达式介绍 Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名...

    探索Java 8的新世界:Lambda表达式全解析

    ### Java 8 中 Lambda 表达式的全解析 #### 引言 Java 8 自发布以来,便成为了 Java 发展史上的一大里程碑。这次版本更新带来了众多重要的新特性,其中最引人注目的当属 Lambda 表达式。这一功能不仅为 Java ...

    Java8之lambda最佳实践_动力节点Java学院整理

    Java8之lambda最佳实践_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Java 8新特性之Lambda与函数式编程.pdf

    Java 8是Java语言发展史上一个重要的里程碑,它引入了多种新特性,旨在增强Java语言表达能力和提升开发效率。其中,Lambda表达式和函数式编程的支持是最具影响力的变化之一。 函数式编程是一种编程范式,它将计算视...

    java8新特性(Stream,lambda等)

    Java 8是Java语言的一个重要版本,引入了许多创新特性,极大地提升了开发效率和代码的可读性。其中,Stream API和Lambda表达式是最为显著的两大亮点,它们为处理集合数据提供了新的方式,并且简化了多线程编程。下面...

    java lambda 表达式(语言篇和类库篇)

    Java Lambda 表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使得处理集合数据和异步编程变得更加简洁。Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。...

    Java 8 lambda表达式

    Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...

    java8 lambda表达式学习总结

    Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...

    Java8新特性之lambda_动力节点Java学院整理

    Java8新特性之lambda_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Java 8 新特性之Stream 和 Lambda

    Java 8 新特性之Stream 和 Lambda

    全网详解(波哥)Java8新特性(Lambda、Stream、LocalDate等)新特性

    全网详解(波哥)Java8新特性(Lambda、Stream、LocalDate等)新特性 自学java的同行们应该都要学习java8的新特性,譬如:(Lambda、Stream、LocalDate等)!本人在学习java的时候看的是波哥的视频,确实讲的不错,很...

    java 8 lambda- expressions 学习资料,例子。练习 java example

    Java 8是Java语言的一个重大版本更新,它引入了lambda表达式,这是Java平台的核心特性之一。Lambda表达式为Java带来了函数式编程的元素,使得开发者可以以更简洁的方式编写代码,尤其是在集合和多线程方面。本资料...

    18.【线程池、Lambda表达式】_java线程_lambda线程池_meantbs3_

    Lambda表达式是Java 8引入的一个重要特性,它是一种函数式编程的体现,可以将代码块当作对象处理。Lambda表达式使得我们可以更加简洁地编写匿名函数,特别是用于那些只需要一次使用的简单功能。Lambda表达式的语法...

    lambda-change-java.rar_java lambda_lambda

    Java Lambda表达式是Java 8引入的一项重大特性,它彻底改变了我们编写函数式编程的方式,使得代码更加简洁、高效。Lambda表达式的核心理念是将功能作为方法参数传递,或者将其存储为字段,甚至在没有显式类型声明的...

Global site tag (gtag.js) - Google Analytics