Lambda 理解的了很久才有一点小感觉。

语法

lambda表达式的特点,它的语法如下面。

parameter -> expression body

下面是一个lambda表达式的重要特征。

  • 可选类型声明 - 无需声明参数的类型。编译器可以从该参数的值推断。

  • 可选圆括号参数 - 无需在括号中声明参数。对于多个参数,括号是必需的。

  • 可选大括号 - 表达式主体没有必要使用大括号,如果主体中含有一个单独的语句。

  • 可选return关键字 - 编译器会自动返回值,如果主体有一个表达式返回的值。花括号是必需的,以表明表达式返回一个值。

变量作用域:

  在lambda表达式,可以指任何最终的变量或有效的最后一个变量(被分配一次)。如果变量被二次赋值,lambda表达式将抛出编译错误。

一、使用线程

public static void main(String[] args) {
//=============================原始版==========================
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("简单的线程编程JDK1.8以前");
}
}).start();
//=====================Lambda可读性强一些================================
new Thread(()->{System.out.println("Lambda可读性强一些");}).start();
//=====================Lambda简洁一些================================
new Thread(()->System.out.println("Lambda简洁一些")).start();
}

Runnable接口源码:

@FunctionalInterface
public interface Runnable {
public abstract void run();
}

  该接口只有一个抽象方法,且该抽象没有参数 所以Lambda 表达式为 ();   System.out.println("简单的线程编程JDK1.8") 是实现该接口覆盖run方法的具体实现逻辑。所以最终Runnable接口的最终实现代码用Lambda表达式实现为:() -> System.out.println("简单的线程编程JDK1.8")。

二、使用  Collections.sort 排序

    public static void testComparatorLambda(){
List<Integer> names = Arrays.asList(1, 10, 3, 2,1);
//=========================创建一个匿名的比较器对象=====================
Collections.sort(names, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
return o1.compareTo(o2);
}
});
//==========================使用Lambda=================================
Collections.sort(names,(Integer o1,Integer o2)->{
System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
return o1.compareTo(o2);
} );
System.err.println(names);
}
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}

  Compoarator接口的compare方法有两个参数 所以Lambda 表达式为 (Integer o1,Integer o2);   {System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));return o1.compareTo(o2);} 是实现该接口覆盖compare方法的具体实现逻辑。所以最终Compoarator接口的最终实现代码用Lambda表达式实现为:(Integer o1,Integer o2)->{ System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2)); return o1.compareTo(o2);}

三、自己模拟业务使用Lambda表达式实现

业务:从一堆苹果中选出红色的苹果。

建立一个苹果类

class Apple{
private String color;
private Integer weight;
构造函数
get,set
}

一个策略接口

interface AppleFilter{
boolean validate(Apple apple);
}

业务实现:

public class LambdaAgo {
public static void main(String[] args) {
List<Apple> apples=Arrays.asList(new Apple("red",120),new Apple("green",189),new Apple("red",110));
//===方法一 使用内部类======
getAppleFilter(apples,new AppleFilter() {
@Override
public boolean validate(Apple apple) {
return apple.getColor().equals("red");
}
});
//===方法二 使用 Lambda======
getAppleFilter(apples,(Apple apple)-> apple.getColor().equals("red")); }
public static List<Apple> getAppleFilter(List<Apple> apples,AppleFilter filter){
List<Apple> apples2=new ArrayList<Apple>();
for(Apple a:apples){
if(filter.validate(a)){
apples2.add(a);
}
}
System.out.println("getAppleFilter:"+apples2);
return apples2;
}
}

JDK1.8 之Lambda的更多相关文章

  1. Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)

    前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...

  2. Java中的内部类————以及jdk1.8的lambda表达式

    一.内部类学习导图 1>.静态内部类: 使用static修饰符来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象.因此使用static修饰的内部类被称为静态内部类. publi ...

  3. jdk1.8的lambda语法(转)

    原文链接:http://www.jb51.net/article/115081.htm 代码: package com.jdk_8; import org.junit.Test; import jav ...

  4. JDK1.8 之Lambda表达式

    概述 Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 你可以将其想做一种速记,在你需要 ...

  5. Android Lambda

    到目前为止 android 本身不支持lambda语法, 但Java的JDK1.8+支持lambda,故我们可以稍做修改,让android支持lambda,以AS为例 1. 确保你的JDK是1.8及以 ...

  6. lambda表达式——写多线程

    JDK1.8 中Lambda 表达式的出现,基本可以取替原来的匿名类实现多线程的方式.下面列举常用的常用的三种情况. 一.普通开启异步线程   new Thread(() -> System.o ...

  7. jdk1.8 -- 方法推导 静态方法、实例方法、构造方法推导

    一.静态方法的推导 public class MainTest { public static void main(String[] args) { // 正常情况下我们需要通过写一个consumer ...

  8. JAVA语言的本质优势

    虽然Java应用最广泛,但与其它语言比并没有什么技术上的优势.常会看到各种抱怨,说Java语言设计不如C#,对native的精确控制和灵活性不然C++,动态性.开发效率方便不如Ruby,Python, ...

  9. IDEA Maven 项目默认编译项目为JDK 1.5

    昨天晚上遇到一个问题,我在idea中创建了有个maven项目,想使用jdk1.8的lambda表达式,结果提示我错误,是1.8才可以.当时我想我的jdk就是1.8啊.经过各种搜索,才知道maven默认 ...

随机推荐

  1. 版本控制工具——SVN

    一.需求 需求之一:备份 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流 需求之二:代码还原 这个项目中需要一个很复杂的功能,老王摸索 ...

  2. 20155204第4次实验《Android程序设计》实验报告

    20155204第四次实验报告 一.实验内容及步骤 1.Android Stuidio的安装测试: 安装 Android Stuidio 完成Hello World, 要求修改res目录中的内容,He ...

  3. sklearn半监督学习

    标签: 半监督学习 作者:炼己者 欢迎大家访问 我的简书 以及 我的博客 本博客所有内容以学习.研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢! --- 摘要:半监督学习 ...

  4. R Language Learn Notes

    One #install package install.packages("ggplot2") #load library library(ggplot2) #update.pa ...

  5. win7升级到win10,出现算术运算溢出问题

    前台winform,后台java代码是: OutputStream ou=(OutputStream)response.getOutputStream(); ou.write(rightSet.get ...

  6. C++操作符优先级带来的错误

    在刷LeetCode题目:190. 颠倒二进制位:颠倒给定的 32 位无符号整数的二进制位时,可以利用左移和右移操作符来实现数字翻转: 错误解法: class Solution { public: u ...

  7. java之接口开发-初级篇-webservice协议

    webservice协议 客户端: 客户端生成使用soapUI生成 外部提供webservice地址,地址后加?wsdl.选择好目录然后生成,放到项目中实现 服务端: web.xml平级目录下创建se ...

  8. 创建image

    摘要: 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. OpenStack 为终端用户提供了 Web ...

  9. Fedora 28 UEFI模式安装过程记录

    这次的折腾是个意外.不过还是要记录一下. 多次做启动盘,把U盘做坏了.将U盘用量产工具修复以后就能做启动盘了.从官网下了Fedora 28的镜像(与CentOS同属RedHat系,尽量与鸟哥一致),用 ...

  10. 由A到D中间可不止“B、C”

    在电子信息系统的学习中,我们或许早就被告知现实世界是模拟的,而数字化的模拟世界则越来越展现更多的风采.但是所谓的数字和模拟只是相对的而已,你可以把模拟量当做无穷数字量的组合,也可以把数字量当做具有不同 ...