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. uva 1449 - Dominating Patterns

    简单的AC自动机: #include<cstdio> #include<cstring> #include<queue> #define maxn 150005 u ...

  2. Win7系统Matlab2013a安装.m文件不自动关联到MATLAB.exe解决方法

    1.在matlab命令行中输入以下代码: cwd=pwd; cd([matlabroot '\toolbox\matlab\winfun\private']); fileassoc('add',{'. ...

  3. Android学习及如何利用android来赚钱

    一.如何学习Android      android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展 ...

  4. 【HDU 5233】Tree chain problem (树形DP+树剖+线段树|树状数组)最大权不相交树链集

    [题目] Tree chain problem Problem Description Coco has a tree, whose vertices are conveniently labeled ...

  5. RocketMQ在windows上安装和开发使用

    1.概述 RocketMQ是alibaba公司开源的一个纯java的开源消息中间件. 2.开发测试环境搭建 到github上面rocketMQ,我选择的是alibaba-rocketmq-3.2.6. ...

  6. 改善C#程序的50种方法

    为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果.对于C ...

  7. FusionCharts参数说明-----3D饼图属性(Pie3D.swf )

    animation 是否显示加载图表时的动画 palette 内置的图表样式,共5个 paletteColors 自定义图表元素颜色(为多个,如过过少会重复) showAboutMenuItem 右键 ...

  8. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  9. 监控CPU和内存的使用

    监控CPU和内存的使用: #!/bin/bash #script to capture system statistics outfile=/home/rainbow/test/file.csv da ...

  10. C文件操作之写入字符串到指定文件并在屏幕显示