JDK1.8 之Lambda
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的更多相关文章
- Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)
前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...
- Java中的内部类————以及jdk1.8的lambda表达式
一.内部类学习导图 1>.静态内部类: 使用static修饰符来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象.因此使用static修饰的内部类被称为静态内部类. publi ...
- jdk1.8的lambda语法(转)
原文链接:http://www.jb51.net/article/115081.htm 代码: package com.jdk_8; import org.junit.Test; import jav ...
- JDK1.8 之Lambda表达式
概述 Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 你可以将其想做一种速记,在你需要 ...
- Android Lambda
到目前为止 android 本身不支持lambda语法, 但Java的JDK1.8+支持lambda,故我们可以稍做修改,让android支持lambda,以AS为例 1. 确保你的JDK是1.8及以 ...
- lambda表达式——写多线程
JDK1.8 中Lambda 表达式的出现,基本可以取替原来的匿名类实现多线程的方式.下面列举常用的常用的三种情况. 一.普通开启异步线程 new Thread(() -> System.o ...
- jdk1.8 -- 方法推导 静态方法、实例方法、构造方法推导
一.静态方法的推导 public class MainTest { public static void main(String[] args) { // 正常情况下我们需要通过写一个consumer ...
- JAVA语言的本质优势
虽然Java应用最广泛,但与其它语言比并没有什么技术上的优势.常会看到各种抱怨,说Java语言设计不如C#,对native的精确控制和灵活性不然C++,动态性.开发效率方便不如Ruby,Python, ...
- IDEA Maven 项目默认编译项目为JDK 1.5
昨天晚上遇到一个问题,我在idea中创建了有个maven项目,想使用jdk1.8的lambda表达式,结果提示我错误,是1.8才可以.当时我想我的jdk就是1.8啊.经过各种搜索,才知道maven默认 ...
随机推荐
- 20155321 2016-2017-2 《Java程序设计》第十周学习总结
20155321 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 局域网和广域网:局域网通常限定在一个有效的地理区域之内,广域网由许多局域网组成.最 ...
- 深入Redis 主从复制原理
原文:深入Redis 主从复制原理 1.复制过程 2.数据间的同步 3.全量复制 4.部分复制 5.心跳 6.异步复制 1.复制过程 从节点执行 slaveof 命令. 从节点只是保存了 slaveo ...
- WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书
原文:WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书 最近项目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是 ...
- 【LG5019】[NOIP2018]道路铺设
[LG5019][NOIP2018]道路铺设 题面 洛谷 题解 \(NOIP\) 抄 \(NOIP\)差评 设当前做到了位置\(i\) 且\(h_i\) \(-\) \(h_i\)\(_+\)\(_1 ...
- angularjs 路由机制
前言 AngularJS路由主要有内置的ngRoute和一个基于ngRoute开发的第三方路由模块ui-router,内置的ngRoute有时满足开发需求,使用ui-router可以解决很多原生ngR ...
- 怎样安装Scrapy
Windows怎样安装Scrapy? pip install scrapy会报错 访问https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载并放到 ...
- Linux 安装ActiveMQ(使用Mac远程访问)
阅读本文需要安装JDK 一 ActiveMQ简介 activemq是用java语言编写的一款开源消息总线 activemq是apache出品 activemq消息的传递有两种类型 一种是点对点: 即一 ...
- 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间
使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...
- 深入了解MySQL存储索引
(一)关于存储引擎 创建合适的索引是SQL性能调优中最重要的技术之一.在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到 ...
- CSP201312-3:最大的矩形
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...