上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习。本文就从java8新特性中比较重要的Lambda表达式开始学学习。

一、为什么要使用Lambda表达式

  Lambda是一个匿名函数,我们可以baLambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。作为一种更紧凑得代码风格,使得java得语言表达能力得到提升。Lambda表达式需要函数式接口的支持,接口中只有一个抽象方法得接口叫做函数式接口。可以使用@FunctionalInterface修饰,可以检查是否是函数式接口。

二、Lambda表达式基础语法

  java8中新增了一个操作符,“->”箭头表达式,也叫Lambda操作符。Lambda表达式左侧为Lambda表达式得参数列表,右侧为操作步骤与逻辑,也叫做Lambda体。Lambda表达式有几种语法格式,下面就来一一学习。

  1. 无参数,无返回值(()-> 接口得功能)。

 /**
*
* 语法一:无参数,无返回值(()-> 执行的代码)
*/
@Test
public void test1() {
//java8实现Runnable方法
Runnable run = () -> System.out.println("Hello Lambda");
run.run(); //java8以前得写法
Runnable run1 = new Runnable() { @Override
public void run() {
System.out.println("Hello World");
}
};
run1.run();
}

  其中需要注意得是,在java1.7以前,在匿名内部类中使用同级别得得局部变量时,这个局部变量必须时final类型得,但是在java8以后,局部变量不用final修饰了,final可以省略,但是其类型还是默认为final类型的。

  2.一个参数,无返回值

     /**
* 语法二:一个参数,无返回值
*/
@Test
public void test2() {
Consumer<String> t = (x) -> System.out.println(x);
t.accept("Hello Lambda");
}

  注意,如果只有一个参数,小括号可以不写。

     /**
* 语法二:一个参数,无返回值
*/
@Test
public void test2() {
Consumer<String> t = x -> System.out.println(x);
t.accept("Hello Lambda");
}

  3. 多个参数,多条语句,有返回值。

     /**
* 语法三:多个参数,多条语句,有返回值。
*/
@Test
public void test3() {
Comparator<Integer> com = (x, y) -> {
System.out.println(x);
System.out.println(y);
return 0;
};
System.out.println(com.compare(1, 3));
}

  4.多个参数,一条语句,有返回值

     /**
* 语法四:多个参数,一条语句,有返回值
*/
@Test
public void test4() {
//只有一条语句与返回值时,大括号和return都可以省略
Comparator<Integer> com = (x, y) -> 0; System.out.println(com.compare(1, 3));
}

  注意:只有一条语句与返回值时,大括号和return都可以省略。

  5.Lambda表达式得参数列表可以不用写,因为JVM编译器可以通过上下文推断出类型,即“类型推断”

三、Lambda表达式需要“函数式接口”的支持

  函数式接口:接口中只有一个抽象方法时,那么这个接口叫做函数式接口。函数式接口可以使用@FunctionalInterface修饰,jvm会自动检查该接口是否为函数式接口。

 @FunctionalInterface
public interface myLambdaModle<T> { public int test(T t1, T t2); }

  需求:对两个数进行运算

     @Test
public void test5() {
int sum1 = myTest(3, 6, (x, y) -> x*y);
int sum2 = myTest(3, 6, (x, y) -> x-y);
int sum3 = myTest(3, 6, (x, y) -> x+y);
int sum4 = myTest(3, 6, (x, y) -> x/y);
} public int myTest(int o1, int o2, myLambdaModle<Integer> m) {
return m.test(o1, o2);
}

  这样,我们就可以使用一个接口就对数字进行运算操作,具体什么操作可以自己去定义。

  从本文可以看出,原来JDK1.7以前,如果定义一个抽象方法,一个方法,就只能实现一种运算,而现在,实现完全可以自己去定义代码简化了许多。后面随笔会继续学习java8的四大内置得核心函数式接口。

    

java8新特性——Lambda表达式的更多相关文章

  1. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  2. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  3. Java8新特性 - Lambda表达式 - 基本知识

    A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...

  4. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  5. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  6. Java8 新特性lambda表达式(一)初始

    本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...

  7. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  8. Java8新特性-Lambda表达式

    1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...

  9. Java8新特性——lambda表达式.(案例:词频统计)

    需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...

随机推荐

  1. 数组与集合List的相互转化

    数组转化为集合 #此运用的是Arrays中的asList方法,返回一个List集合 *当数组元素为基本数据类型是把整个数组当作一个元素放入List集合中,代码举例: ,,}; List<int[ ...

  2. 【NOIP】提高组2014

    Day1 T1(暴力):大水题 #include<cstdio> ][]={ ,,,,, ,,,,, ,,,,, ,,,,, ,,,,, }; ],b[]; int main() { in ...

  3. flume监控一个linux指定的一个文件夹的文件信息

    1.编辑一个配置文件 flume-app.conf  拷贝至fulme的安装目录的conf下 # The configuration file needs to define the sources, ...

  4. 【洛谷 P4291】 [HAOI2008]排名系统(Splay,Trie)

    题目链接 不是双倍经验我会去\(debug\)一上午? 一开始我是用的\(map+string\),跑的太慢了,T了4个点. 后来我手写了\(string\),重载了小于号,依然用的\(map\),T ...

  5. 2017ACM暑期多校联合训练 - Team 6 1003 HDU 6098 Inversion (模拟)

    题目链接 Problem Description Give an array A, the index starts from 1. Now we want to know Bi=maxi∤jAj , ...

  6. 【项目管理】git和码云的使用【转】

    转自:https://www.cnblogs.com/riverdubu/p/6491944.html 缘起 说了那么多关于git和码云相关的事,一直都没给大伙讲解这个码云究竟是个啥玩意儿. 今天就给 ...

  7. 记一个多线程使用libevent的问题

    前段时间使用libevent网络库实现了一个游戏服务器引擎,在此记录下其中遇到的一个问题. 我在设计服务器上选择把逻辑和网络分线程,线程之间通信使用队列.但是这样做会有个问题: 当逻辑线程想要主动的发 ...

  8. VS2015_动态链接库学习

    非MFC动态链接库 创建一个名为ex1的Win32项目 创建一个DLL项目,保留预编译的头文件   默认文件 创建完成项目之后,包含几个默认的文件   stdafx.h文件用于包含标准系统包含的头文件 ...

  9. MemCached缓存操作

    Web项目在运行时,通常需要从数据库中进行读写.随着操作数据量的增大,以及访问量的集中,数据库的负载增加,数据库响应变慢,网站访问速度变慢的情况.Memcached就是用来解决这些问题的. Memca ...

  10. s3cmd : Add a config parameter to enable path-style bucket access 当ceph rgw使用域名时,需要支持 path-style bucket特性

    s3cmd 要是1.6.1 之后的版本 增加配置项:  vi .s3cfg use_path_mode = True 源码参考: cat  /usr/local/lib/python2.7/dist- ...