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 ...
随机推荐
- ubuntu 10.04 安装qt 5.0.2
转自ubuntu 10.04 安装qt 5.0.2 从qt project网站下载下来最新的qt5.0.2套件,发现是个.run文件,添加x属性,然后直接sudo ./****.run, 提示 /l ...
- Android java程序获取assets资产文件
AssetManager assetManager=this.getAssets(); inputStream = assetManager.open("test.xml");
- 【Uvalive 5834】 Genghis Khan the Conqueror (生成树,最优替代边)
[题意] 一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少.最后求Q ...
- SourceTree + Bitbucket - 轻松云端作业
如何新建bitbucket工程 常见流程: 1: 本地电脑 A:创建Xcode工程 2:Bitbucket网站 A:"创建"仓库 B:然后"从零开始",根据提示 ...
- Android性能测试
FPS和流畅度 FPS 1.dumpsys SurfaceFlinger –latency shell 脚本通过 dumpsys SurfaceFlinger --latency 数据计算 FPS 和 ...
- slua 中使用 lua5.3
因为我们服务器极有可能要迁移到 skynet 上,它基于 lua5.3,而服务器和客户端会公用很多lua代码,所以在考虑在客户端 slua 中使用 lua5.3. 经过编译后,发现 slua 对 lu ...
- HDOJ/HDU 1200 To and Fro(加密解密字符串)
Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secret ...
- 我的第一篇Markdown博客
我的第一篇Markdown博客 这是我第一次用Markdown写博客,发现还是比较好用的,加上Marsedit也支持了Markdown的博客预览,博客园也加了Markdown的格式支持,就更加方便了, ...
- uva 10047 the monocyle (四维bfs)
算法指南白书 维护一个四维数组,走一步更新一步 #include<cstdio> #include<cstring> #include<queue> #includ ...
- vmware10安装win8x64(亲测)
首先,创建虚拟机,选择典型 下一步后 弄完后选择“完成”,这下就可以安装了 之后分区,之后选cdrom做启动,之后安装win8到第一分区