JDK8新特性之Lambda表达式
Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。lambda语法结构:
(参数1,参数2...)->{重写方法的内容,不定义方法名}
先看一个使用匿名内部类定义一个新线程的方法:
@Test
public void test1(){
new Thread(new Runnable() {
@Override
public void run() {
for(int x=0;x<100;x++){
System.out.println("run..."+x);
}
}
}).start();
for(int x=0;x<100;x++){
System.out.println("main..."+x);
}
}
使用lambda表达式则可以简化匿名内部类的写法:
@Test
public void test2(){
new Thread(()->{
for(int i=0;i<100;i++){
System.out.println("run..."+i);
}
}).start();
for(int i=0;i<100;i++){
System.out.println("main..."+i);
}
}
好吧,代码是不是极大的简化了?
再来看看一个例子,传统方法过滤一个文件夹中的文件是这样的:
@Test
public void test3(){
File file = new File("F:\\test");
File[] fs = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//获取所有的xml文件
return pathname.getName().endsWith(".xml");
}
});
for(File f:fs){
System.out.println(f.getName());
}
}
使用了lambda表达式之后怎样过滤文件呢?
@Test
public void test4(){
File file = new File("F:\\test");
//注意这里pathname前面的String不写
File[] fs = file.listFiles((pathname)->{
return pathname.getName().endsWith(".xml");
});
for(File f:fs){
System.out.println(f.getName());
}
}
lambda表达式,既然是一种表达式,它就不是内部类,这样编译过后不会产生内部类,它只是内部类的另一种实现方式。
再看看给Set集合排序的例子:
传统方式是这样的:
@Test
public void test5() {
Set<String> set = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length() == 0 ? o1.compareTo(o2)
: o1.length() - o2.length();
}
});
set.add("ac");
set.add("acfa");
set.add("acfadfada");
set.add("ac5423543534524");
System.out.println(set);
}
使用了lambda表达式之后呢?
@Test
public void test6() {
//注意这里的参数名可以自定义
Set<String> set = new TreeSet<String>((s1,o2)->{
return s1.length() - o2.length() == 0 ? s1.compareTo(o2)
: s1.length() - o2.length();
});
set.add("ac");
set.add("acfa");
set.add("acfadfada");
set.add("ac5423543534524");
System.out.println(set);
}
lambda局限性:
1.如果接口有多个方法需要实现,就只能通过匿名内部类来实现,而不可以使用lambda表达式。
2.要使用lambda表达式的地方参数本身就是固定的,只有一个,例如new Thread(),要么没有参数,要么只能是new Runnable().
JDK8新特性之Lambda表达式的更多相关文章
- JDK8新特性(一) Lambda表达式及相关特性
函数式接口 函数式接口是1.8中的新特性,他不属于新语法,更像是一种规范 面向对象接口复习 在这里先回顾一下面向对象的接口,创建接口的关键字为interface,这里创建一个日志接口: public ...
- JDK8新特性02 Lambda表达式02_Lambda语法规则
//函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...
- JDK8新特性01 Lambda表达式01_设计的由来
1.java bean public class Employee { private int id; private String name; private int age; private do ...
- jdk8新特性--使用lambda表达式的延迟执行特性优化性能
使用lambda表达式的延迟加载特性对代码进行优化:
- JDK8新特性:Lambda表达式
Lambda表达式,案例一:new Thread(() -> System.out.println("thread")); Lambda表达式,案例二:由参数/箭头和主体组成 ...
- JDK8新特性03 Lambda表达式03_Java8 内置的四大核心函数式接口
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
随机推荐
- maven安装和环境变量配置
maven安装和环境变量配置 myeclipse自带maven(Maven4MyEclipse)创建项目:新建Web Projects项目,在新建的页面上打上maven的勾.新建的项目里会多出个pom ...
- Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚
比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: push ebp mov esp, ebp sub ...
- Python Monkey patch猴子补丁
monkey patch (猴子补丁) 用来在运行时动态修改已有的代码,而不需要修改原始代码. 简单的monkey patch 实现:[python] #coding=utf-8 def orig ...
- OSS研究
在以前没有毕业之前,做过了一个了播放器,其实就是mplayer的二次开发. 如果在这个播放器之上,加个oss作声音输入,那不就可以做个卡拉OK啦? 1.OSS的定义 OSS(Open Sound Sy ...
- 解决MySQL服务启动时报1067错误
工具/原料 MySQL_5.6.24_win32 方法/步骤 当我们安装完Mysql时,如果在服务当中(可以在“运行”-->"service.msc"打开并查看)无法看到My ...
- React入门2
React 入门实例教程 最简单开始学习 JSX 的方法就是使用浏览器端的 JSXTransformer.我们强烈建议你不要在生产环境中使用它.你可以通过我们的命令行工具 react-tools 包来 ...
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
转自:http://www.cnblogs.com/zhili/archive/2012/09/03/2666974.html 上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享 ...
- ADO.NET 增删查改小总结
转自:http://www.cnblogs.com/ashu123/archive/2010/10/10/ado_1.html 三套路-----增删改 1 using System.Data.SqlC ...
- jquery mobile (一)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...