博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK1.8 之Lambda
阅读量:5119 次
发布时间:2019-06-13

本文共 3633 字,大约阅读时间需要 12 分钟。

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接口源码:

@FunctionalInterfacepublic 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
names = Arrays.asList(1, 10, 3, 2,1); //=========================创建一个匿名的比较器对象===================== Collections.sort(names, new Comparator
() { @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); }
@FunctionalInterfacepublic interface Comparator
{ 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
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
getAppleFilter(List
apples,AppleFilter filter){ List
apples2=new ArrayList
(); for(Apple a:apples){ if(filter.validate(a)){ apples2.add(a); } } System.out.println("getAppleFilter:"+apples2); return apples2; }}

 

转载于:https://www.cnblogs.com/jalja/p/7655170.html

你可能感兴趣的文章
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
我对前端MVC的理解
查看>>