JAVA8新特性——Lamda表达式
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~
Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类。
先来看看传统的匿名内部类调用方式:
interface MyInterface{
    void lMethod();
}
public class Main {
    public static void test(MyInterface myInterface){
        myInterface.lMethod();
    }
    public static void main(String[] args) {
        test(new MyInterface() {
            @Override
            public void lMethod() {
                System.out.println("Hello World!");
            }
        });
    }
}
在主类中的这么几行代码,嵌套几层就为了输出一个Hello World!是不是很麻烦?但是由于java结构的完整性,我们还不得不那么做,现在JDK1.8来了。
再来看看使用Lamda表达式改写上面的代码:
interface MyInterface{
    void lMethod();
}
public class Main {
    public static void test(MyInterface myInterface){
        myInterface.lMethod();
    }
    public static void main(String[] args) {
        test(()->System.out.println("Hello World!"));
    }
}
这就是Lamda表达式语言,为了解决匿名内部类繁杂的操作而出现。
Lamda语法有三种形式:
- (参数) ->单行语句;
 - (参数) ->{多行语句};
 - (参数) ->表达式;
 
括号()可以大致理解为就是方法,里面是参数变量,在上面的例子中()->System.out.println("Hello World!") 前面的()代表void lMethod()方法,它没有入参,所以为空,->后面是一个单行语句;
如果->后面是多行语句,需要用{ }装起来,每条语句后需要有分号;
->后面也可以是一个表达式,如:a+b等。
(参数) ->单行语句:
interface MyInterface{
    void lMethod(String str);
}
public class Main {
    public static void test(MyInterface myInterface){
        myInterface.lMethod("Hello World!");//设置参数内容
    }
    public static void main(String[] args) {
        //首先在()中定义此表达式里面需要接收变量s,后面的单行语句中就可以使用该变量了
        test((s)->System.out.println(s));
    }
}
(参数) ->{多行语句}:
interface MyInterface{
    void lMethod(String str);
}
public class Main {
    public static void test(MyInterface myInterface){
        myInterface.lMethod("Hello World!");//设置参数内容
    }
    public static void main(String[] args) {
        //首先在()中定义此表达式里面需要接收变量s,后面的多行语句中就可以使用该变量了。注意:多行语句别少“;”号
        test((s)->{
            s=s+s;
            System.out.println(s);
        });
    }
}
(参数) ->表达式:
interface MyInterface{
    int lMethod(int a,int b);
}
public class Main {
    public static void test(MyInterface myInterface){
        int result=myInterface.lMethod(1,2);//设置参数内容,接收返回参数
        System.out.println(result);
    }
    public static void main(String[] args) {
        test((x,y)-> x*y );//调用方法
        //相当于
//        test((x,y)-> {return  x*y;});
    }
}
这样,Lamda表达式就看起来很简单了,有不有!
匿名内部类,我们比较常用的地方在哪儿?线程类Thread,以前我们可能这样写:
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程操作!");
    }
});
现在,使用Lamda表达式,简单写为:
new Thread(()->System.out.println("线程操作!"));
总结:利用Lamda表达式是为了避免匿名内部类定义过多无用的操作。
JAVA8新特性——Lamda表达式的更多相关文章
- java8新特性lamda表达式在集合中的使用
		
1.利用stream().forEach()循环处理List; List<String> list = Lists.newArrayList();//新建一个List 用的google提供 ...
 - Java8新特性-Lambda表达式是什么?
		
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
 - 乐字节-Java8新特性-Lambda表达式
		
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
 - java8新特性——Lambda表达式
		
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
 - Java8 新特性 Lamdba表达式
		
Lamdba 表达式为什么出现 Java8是自java延生以来最大的改变,他允许java中的方法和函数成为一等公民(可以在方法间传递),所以就应运而出现了Lamdba表达式,他可以将表达式传递给另 ...
 - Java8 新特性_Lambda 表达式
		
1. Java8新特性_简介 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 减少空指针异常的容器 Optional 2. ...
 - Java8新特性: lambda 表达式介绍
		
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
 - Java8新特性 - Lambda表达式 - 基本知识
		
A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...
 - java8新特性-lambda表达式和stream API的简单使用
		
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
 
随机推荐
- JS-检测浏览器类型及版本
			
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
 - HTML的特殊字符-图标对应表
			
本文摘自:http://www.cnblogs.com/web-d/archive/2010/04/16/1713298.html HTML特殊字符编码大全:往网页中输入特殊字符,需在html代码 ...
 - 【事件流】浅谈事件冒泡&&事件捕获------【巷子】
			
首先在扯淡的时候我们需要先了解一个东西,这个东西就是事件流. 1.什么是事件流? 解释:当一个HTML元素触发一个事件处理函数的时候,该事件会在该元素节点到根节点之间传播,传播路径所经过的节点都会接受 ...
 - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]
			
Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-co ...
 - ZOJ 3202 Second-price Auction
			
Second-price Auction Time Limit: 1 Second Memory Limit: 32768 KB Do you know second-price aucti ...
 - saml,sso
			
saml,sso centos version get:// cat /etc/redhat-release
 - Apache 2.4 编码GB2312中文乱码的问题
			
今天部署了一个项目,代码和数据库都是gb2312的,本地和服务器都是apache2.4的版本,本地编码没问题,response的content-type是空的.按html的mete解析的,查看源码也是 ...
 - conda
			
Conda是什么? Conda 是Anaconda下用于包管理和环境管理的命令行工具, Conda下一切都是包,包括Python和conda自己 Conda ≍ pip(包管理) + vitualen ...
 - mysql 数据操作 多表查询 准备
			
为什么需要多表查询: 因为我们不可能把所有数据都放在一张表里 我们把不同数据存储 放在一张一张不同表 方便管理,但我们为了方便管理,把数据拆分到一张一张表去存储. 但是数据还是一个整体,数据之间是有关 ...
 - Swagger2 生成 Spring Boot API 文档
			
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...