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 ...
随机推荐
- csu 10月 月赛 D 题 CX and girls
Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好.现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的 ...
- 李洪强漫谈iOS开发[C语言-025]-赋值运算符案例
- 如何使用mysql的grant命令(详解)
grant命令的基本格式 grant 权限 on 数据库对象 to 用户 实例一:在任意ip地址登陆的common_user用户可以对testdb数据库里的数据进行查询操作.插入操作.更新操作.删除操 ...
- C++ Socket UDP "Hello World!"
这是C++ SOCKET网络程序中的C/S结构之UDP "Hello World !",共两个控制台工程: //////////////////////////////////// ...
- 使用Systrace分析UI性能
开发应用的时候,应该检查它是否有流畅的用户体验,即60fps的帧率.如果由于某种原因丢帧,我们首先要做的就是知道系统在做什么(造成丢帧的原因). Systrace允许你监视和跟踪Android系统的行 ...
- 无法使用以下搜索标准找到 X.509 证书: StoreName“My”、StoreLocation“LocalMachine”、FindType“FindBySubjectName”、FindValue“MyWebSite”。
http://www.codeproject.com/Articles/96028/WCF-Service-with-custom-username-password-authenti 需要制作证书 ...
- POJ_1742_Coins_(动态规划,多重部分和)
描述 http://poj.org/problem?id=1742 n种不同面额的硬币 ai ,每种各 mi 个,判断可以从这些数字值中选出若干使它们组成的面额恰好为 k 的 k 的个数. 原型: n ...
- spring-data-redis --简单的用spring-data-redis
spring-data-redis序列化策略 spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷.sdr提供了4种内置的seriali ...
- linux .o,.a,.so文件解析
linux下文件的类型是不依赖于其后缀名的,但一般来讲:.o,是目标文件,相当于windows中的.obj文件.so 为共享库,是shared object,用于动态连接的,和dll差不多.a为静态库 ...
- Xamarin.Android 4.10.01068 & Xamarin.iOS 1.8.361
Xamarin.Android 4.10.01068 & Xamarin.iOS 1.8.361 NEW support for Visual Studio 2013 & Portab ...