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表达式的更多相关文章

  1. JDK8新特性(一) Lambda表达式及相关特性

    函数式接口 函数式接口是1.8中的新特性,他不属于新语法,更像是一种规范 面向对象接口复习 在这里先回顾一下面向对象的接口,创建接口的关键字为interface,这里创建一个日志接口: public ...

  2. JDK8新特性02 Lambda表达式02_Lambda语法规则

    //函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...

  3. JDK8新特性01 Lambda表达式01_设计的由来

    1.java bean public class Employee { private int id; private String name; private int age; private do ...

  4. jdk8新特性--使用lambda表达式的延迟执行特性优化性能

    使用lambda表达式的延迟加载特性对代码进行优化:

  5. JDK8新特性:Lambda表达式

    Lambda表达式,案例一:new Thread(() -> System.out.println("thread")); Lambda表达式,案例二:由参数/箭头和主体组成 ...

  6. JDK8新特性03 Lambda表达式03_Java8 内置的四大核心函数式接口

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  7. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  8. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  9. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

随机推荐

  1. cf 219D

    树形dp; 思想: 把正向边赋值为0:反向边赋值为1:然后求出点到其他点的最小距离: 两次dfs: 第一次是从下往上:记录每个点到所有子树中需要改变的边的条数: 第二次是自上往下:由父节点求子节点到所 ...

  2. MIME

    http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000000558 http://www.jb51.net/hack/10623. ...

  3. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  4. Linux平台下Java调用C函数

    JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...

  5. insert into select 堵塞update

    mysql[192.168.5.15] blocking_thread[2286333] blocking_query[insert into temp_zhuyou_mktact_1(hotel_g ...

  6. 【HDOJ】3416 Marriage Match IV

    先求SPSS.然后遍历每条边,检查是否为最短路径的边,如果是(dis[v]==dis[u]+w)则加入到网络流中.最后Dinic最大流. /* 3416 */ #include <iostrea ...

  7. SharePoint 2010顶部链接导航栏的详细操作

    转:http://www.360sps.com/Item/UseTopLink.aspx 在SharePoint 2010环境的页面中,导航链接总体上可以分为两类,一类是显示在左侧的快速启动栏,另一类 ...

  8. Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)

    错误提示: Undefined function or method 'uiopen' for input arguments of type'char 解决方案: 运行命令 restoredefau ...

  9. 传输层之TCP

    ---恢复内容开始--- 坞无尘水槛清,相思迢递隔重城. 秋阴不散霜飞晚,留得枯荷听雨声.    --李商隐 上一篇中我们了解了socket编程是基于TCP或者UDP,所以我们有必要对TCP,和UDP ...

  10. HTC仅限拨打紧急电话

    问题描述: 我手上有台 HTC One V 没碰没撞,突然打不出电话,信号上显示一个叉,屏幕上显示“仅限拨打紧急电话” 解决办法:经百度,原来很多HTC机子都有这种情况,幸好不是硬件坏了,只需按以下步 ...