Java Lambda学习
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学习相关推荐
- 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】
深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...
- Java Lambda 表达式快速学习
Lambda 表达式来源于数学, 因为其简洁性,很多开发语言都支持, Java 在版本8 开始引入. Lamba 表达式是什么? 匿名内部类 接口只能有一个需要被实现的方法 Lamba 表达式作用 代 ...
- Java 8学习资料汇总
本文首发于InfoQ. Java 8发布已经有一段时间,它被认为是Java 5发布以来最大的一次版本升级.Java 8 为Java语言.编译器.类库.开发工具以及JVM(Java虚拟机)带来了大量新特 ...
- Java Lambda表达式入门
本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
- Java Lambda表达式初探
前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...
- java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程
java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...
- Java Lambda表达
Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...
- Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...
最新文章
- 感光电路板制作(转收藏)
- 64 DLL动态链接库换一台电脑就不能加载
- OVS datapath简介(十八)
- Mybatis通过colliection属性递归获取菜单树
- python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝
- C++ 訪问控制权限图解
- 质子和中子数量的一点疑问
- android开发,动态图标,Android动态更新APP图标
- ViT为何引入cls_token
- Vulkan层的简要说明
- matlab神经网络 股票预测模型,如何用MATLAB的BP神经网络做股票预测
- html5 css3 图片画廊,js和CSS3 3D立方体图片画廊特效
- 计算机启用无线网络,有无线网络,电脑也开启了无线网络了,但是就是搜索不到无线网,怎么设置?...
- HDMI差分对走线是否需要走等长
- 安卓APP按键美化——圆角按键
- 【每日一题】字符串解码
- go语言进行web开发之安装iris框架
- linux内核打印前有buildroot,[教程]使用buildroot完全自定义自己的embedded linux系统(nand)...
- 【Unity VR开发】结合VRTK4.0:键盘操作运动与旋转
- mips汇编代码示例解释_通过示例解释cosmosdb