Lambda表达式作为Java8的新特性,目的是为了让方法变得更加简洁,不再需要实现接口就可以是执行方法。
表达式只能引用被final修饰的外部变量,同时表达式中的this指向外围实例。
写一个MessageExample接口,实现一个输出语句的例子

public class LambdaExample {public static void main(String[] args) {MessageExample messageExample = (s) -> System.out.println();messageExample.sendMessage("This is a message!");}interface MessageExample{void sendMessage(String s);}
}

使用lambda对list进行遍历

public class LambdaExample1 {public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("This ");strings.add("is ");strings.add("a ");strings.add("message");strings.add("!");//老旧的方式,我们不要,毕竟时代在进步for (String str : strings) {System.out.print(str);}//lambda方式,yes!!!strings.forEach(s -> System.out.print(s));//更牛逼的写法,双冒号在java 8被引入成为引用运算法//可以理解为把lambda表达式的参数直接传入print方法 静态引用strings.forEach(System.out::print);}}

常用的排序功能使用lambda实现

public class LambdaExample2 {public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("This ");strings.add("is ");strings.add("a ");strings.add("message");strings.add("!");//原生方法strings.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});//使用lambda对数据进行排序strings.sort((s1,s2) -> (s1.compareTo(s2)));//idea的自动提示,为什么这么写我也不知道strings.sort(String::compareTo);}}
package com.yaku.entity;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

我们使用上面的Person类来实现使用lambda进行集合操作的案例

public class LambdaExample3 {public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("小强",10));personList.add(new Person("小明",8));personList.add(new Person("小红",9));personList.add(new Person("小花",11));personList.add(new Person("小明",12));personList.add(new Person("小黑",15));//地球被魔法师使用黑魔法袭击,地球上的所有人都长了一岁personList.forEach(item -> {item.setAge(item.getAge()+1);System.out.println(item);});Consumer<Person> giveUp = item -> {item.setAge(item.getAge()+1);System.out.println(item);};//从这里看出写在foreach里面的lambda表达式,实际上被java认为是一个Consumer接口//而且Consumer是个泛型接口,可以使lambda表达式变得更加灵活personList.forEach(giveUp);}}

从集合中筛选出年龄大于10岁的Person,这里要结合Stream使用
Stream也是Java 8的新特性,这里不过多赘述

public class LambdaExample4 {public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("小强",10));personList.add(new Person("小明",8));personList.add(new Person("小红",9));personList.add(new Person("小花",11));personList.add(new Person("小明",12));personList.add(new Person("小黑",15));//可以理解为从stream中过滤,过滤条件为年龄大于10岁//未来可能趋势打火的链式编程personList.stream().filter(item -> item.getAge() > 10).forEach(System.out::println);//filter方法中传入的lambda表达式被jvm识别为一个Predicate接口//所以可以直接用这个接口写lambda表达式然后传入filter方法Predicate<Person> ageFilter = (p) -> (p.getAge() > 10);personList.stream().filter(ageFilter).forEach(System.out::println);}}

通过点进上面两个接口Predicate和Consumer的源码中可以看出,都加上了@FunctionalInterface这个注解,所以说目前我们可以推断出,具有@FunctionalInterface这个注解的接口,都可以看做是一个存储lambda表达式的“{}”。FunctionalInterface中文翻译为功能接口。
我们可以点开Stream的源码看到很多方法。链式编程是如何实现的,原理其实很简单,调用A中的方法,方法执行结束后返回值是A,这个时候我们可以接着调用A中的方法,以此类推我们就实现了链式编程(方法像是被串起来一样执行)。
上面例子我们都是遍历集合并输出,下面这个例子去除集合中大于10岁的Person的姓名

public class LambdaExample5 {public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("小强",10));personList.add(new Person("小明",8));personList.add(new Person("小红",9));personList.add(new Person("小花",11));personList.add(new Person("小明",12));personList.add(new Person("小黑",15));//使用Collections的joining方法把符合条件的name拼接成一个字符串//也可是使用toSet,ToXX方法转换成其他集合String str = personList.stream().filter(item -> item.getAge() >10).map(Person::getName).collect(Collectors.joining(""));System.out.println(str);//把年龄大于10的Person筛选出来List<Person> collect = personList.stream().filter(item -> item.getAge() > 10).collect(Collectors.toList());System.out.println(collect);//把personList转化成一个姓名年龄的mapMap<String, Integer> personMap = personList.stream().collect(Collectors.toMap(item -> item.getName(), item -> item.getAge()));Map<String, Integer> personMap1 = personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge));}
}

Java Lambda学习相关推荐

  1. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  2. Java Lambda 表达式快速学习

    Lambda 表达式来源于数学, 因为其简洁性,很多开发语言都支持, Java 在版本8 开始引入. Lamba 表达式是什么? 匿名内部类 接口只能有一个需要被实现的方法 Lamba 表达式作用 代 ...

  3. Java 8学习资料汇总

    本文首发于InfoQ. Java 8发布已经有一段时间,它被认为是Java 5发布以来最大的一次版本升级.Java 8 为Java语言.编译器.类库.开发工具以及JVM(Java虚拟机)带来了大量新特 ...

  4. Java Lambda表达式入门

    本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...

  5. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  6. Java Lambda表达式初探

    前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...

  7. java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

    java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...

  8. Java Lambda表达

    Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...

  9. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

    本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...

最新文章

  1. 感光电路板制作(转收藏)
  2. 64 DLL动态链接库换一台电脑就不能加载
  3. OVS datapath简介(十八)
  4. Mybatis通过colliection属性递归获取菜单树
  5. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝
  6. C++ 訪问控制权限图解
  7. 质子和中子数量的一点疑问
  8. android开发,动态图标,Android动态更新APP图标
  9. ViT为何引入cls_token
  10. Vulkan层的简要说明
  11. matlab神经网络 股票预测模型,如何用MATLAB的BP神经网络做股票预测
  12. html5 css3 图片画廊,js和CSS3 3D立方体图片画廊特效
  13. 计算机启用无线网络,有无线网络,电脑也开启了无线网络了,但是就是搜索不到无线网,怎么设置?...
  14. HDMI差分对走线是否需要走等长
  15. 安卓APP按键美化——圆角按键
  16. 【每日一题】字符串解码
  17. go语言进行web开发之安装iris框架
  18. linux内核打印前有buildroot,[教程]使用buildroot完全自定义自己的embedded linux系统(nand)...
  19. 【Unity VR开发】结合VRTK4.0:键盘操作运动与旋转
  20. mips汇编代码示例解释_通过示例解释cosmosdb

热门文章

  1. OPPO Enco X2怎么样?有颜有实力,千元耳机的新标杆
  2. java冒泡排序代码(仅提供思路)
  3. Java版本微信企业号的开发--03完结
  4. yjk的波库在哪里_盈建科软件
  5. java大作业的打猎游戏_Java基于Swing实现的打猎射击游戏代码
  6. 3月24日服务器维护公告,《阴阳师》3月24日服务器更新维护公告
  7. 前端开发:JS中字符串拼接的总结
  8. linux系统命令pwd,linux系统下pwd命令用法详解
  9. html模板转pdf
  10. echarts横向左右对比柱状图