jdk8之lambda

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Oracle号称今年一定发布jdk8, 即使有bug, jdk8无疑最大的宠儿就是lambda表达式了,还是直接上代码,看看lambda表达式怎么了。

  • 环境:

        openjdk8, eclipse4.3.1(支持jdk8编译)

  • 实例代码:
// Demo1
public class RunnableTest {public static void main(String[] args) {Runnable runner = () -> System.out.println("I am lambda runner.");runner.run();}
}
// Demo2
import javax.swing.JButton;public class ListenerTest {public static void main(String[] args) {JButton btn = new JButton();btn.addActionListener(e -> System.out.println("Event Source is: " + e.getSource()));}
}
// Demo3
//Student.java
public class Student {private String name;private float score;public Student(String name, float score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getScore() {return score;}public void setScore(float score) {this.score = score;}@Overridepublic String toString() {return "Student [name=" + name + ", score=" + score + "]";}
}// ComparatorTest.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;public class ComparatorTest {public static void main(String[] args) {List<Student> students = new ArrayList<>();Random r = new Random();for (int i=0; i<5; i++){students.add(new Student("stu"+i, r.nextFloat() * 100));}Collections.sort(students, (Student s1, Student s2) -> (int)(s1.getScore() - s2.getScore()));for (Student s: students){System.out.println(s);}}
}
看了这3个例子,就会觉得lambda很偏向于函数式编程(如Lisp这种语言),这种语言很简洁,但是易读性不是那么好,没办法,又想简洁又想易读式不太容易的,以前java有匿名类,我们通常就实现这个匿名类里的一个接口,这叫Function Interface,现在我们就可以不用写这个匿名类了,就直接实现接口就行了,就像上面的Demo一样。

下面说一下lambda在Collection上的工作:

  • Function接口:
public interface Function<T, R> {R apply(T t);...
}
Function接受一种类型T输入,以另一类型R输出, 看实例:
import java.util.function.Function;public class Person {private String firstName;private String lastName;private int age;public Person(String firstName, String lastName){this.firstName = firstName;this.lastName = lastName;}public Person(String firstName, String lastName, int age) {this.firstName = firstName;this.lastName = lastName;this.age = age;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** 这里就用Function实现可订制的信息输出* Function: 将输入类型转换为输出类型,这里即将Person输入,以String输出*/public String printCustom(Function<Person, String> f){return f.apply(this);}
}
测试用例:
import java.util.function.Function;/*** Function 测试*/
public class FunctionTest {public static void main(String[] args) {Person person = new Person("Hello", "Function");// 用lambda表达式作为参数传递System.out.println(person.printCustom(p -> "FirstName : " + p.getFirstName()));// 用lambda表达式构建Function对象Function<Person, String> westernStyle = p -> {return "LastName: " + p.getLastName() + ", FirstName: " + p.getFirstName();};Function<Person, String> eastStyle = p -> {return "FirstName: " + p.getFirstName() + ", LastName: " + p.getLastName();};System.out.println(person.printCustom(westernStyle));System.out.println(person.printCustom(eastStyle));}
}

输出结果:

  • 集合的迭代:
import java.util.ArrayList;
import java.util.List;/*** 通过lambda迭代集合*/
public class LoopTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();for (int i=0; i<5; i++){ps.add(new Person("XX"+i, "OO"+i));}ps.forEach(p -> System.out.println(p.getFirstName()));//ps.forEach(Person::printEast);System.out.println("-------------------------");ps.forEach(p -> {System.out.println(p.printCustom(r->r.getLastName()+" " + r.getFirstName()));});}
}
  • Predicate接口,它接受一种输入类型,并通过test接口方法返回boolean值:
public interface Predicate<T> {boolean test(T t);...
}

Predicate可以有效实现集合过滤操作:

测试用例:

/*** Predicate实现集合过滤*/
public class PredicateTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10; i++){ps.add(new Person("firstName"+i, "lastName"+i, r.nextInt(20) + 1));}Predicate<Person> children = p -> p.getAge() < 12;Predicate<Person> teenagers = p -> p.getAge() >= 12 && p.getAge() < 18;Predicate<Person> adults = p -> p.getAge() >= 18;for (Person p : ps){System.out.print(p.getFirstName() + "'s age is " + p.getAge());if (children.test(p)){System.out.println(", is a child.");} else if (teenagers.test(p)){System.out.println(", is a teenager.");} else if(adults.test(p)){System.out.println(", is an adult.");}}}
}

输出结果:

  • 2个综合些的例子:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class CollectTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10;i++){	ps.add(new Person("firstname"+i, "lastname"+i, r.nextInt(30) + 1));}// 过滤条件>18岁Predicate<Person> adults = p -> p.getAge() > 18;// 通过collect获取过滤后的集合List<Person> filteredPersons = ps.stream().filter(adults).collect(Collectors.toList());filteredPersons.forEach(p -> System.out.println(p.getFirstName() + " "+ p.getLastName()+"'s age: " + p.getAge()));}
}
import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.Random;
import java.util.function.Predicate;/*** 通过map来实现求最大值,平均值*/
public class MapTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10;i++){	ps.add(new Person("firstname"+i, "lastname"+i, r.nextInt(30) + 1));}// 过滤条件>18岁Predicate<Person> adults = p -> p.getAge() > 18;//最大年龄OptionalInt maxAge = ps.parallelStream().filter(adults).mapToInt(p -> p.getAge()).max();System.out.println("最大年龄:" + maxAge.getAsInt());// 求18岁以上的平均值OptionalDouble average = ps.parallelStream().filter(adults).mapToDouble(p -> p.getAge()).average();System.out.println("平均年龄:" + average.getAsDouble());}
}
  • 收工。

转载于:https://my.oschina.net/indestiny/blog/196347

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Asp.Net中Excel操作权限的问题

近日在打开原来写的一个网页程序运行时&#xff0c;出现了Excel操作权限的问题&#xff0c;具体的说就是在代码中调用下面这段与Excel操作有关的语句时 Application curExcelApp new ApplicationClass(); 提示权限不足&#xff0c;具体的提示内容如下&#xff1a; 检索 COM 类…

再一贴[亲爱的,我不小心怀孕了~!]

这是我们第一次见面的酒吧。我们在这里度过了多少个夜晚&#xff0c;有过多少美好的回忆。  可是4月1日那天&#xff0c;我的心情很沉重&#xff0c;很忧郁。我不知道&#xff0c;这个消息对于我&#xff0c;对于你&#xff0c;对于我们意味着什么。我是如此渴望而又恐惧。 …

python路径长度限制,Linux下文件名长度限制

Linux下文件名长度限制出现场景&#xff1a;在迭代中有一个需求是将pdf文件名修改为所有班级的名称集合&#xff0c;出现的班级过多导致的文件名过长在linux下无法创建文件和文件夹的情况解决方式&#xff1a;经过查证&#xff0c;linux中文件名最长为255字符&#xff0c;文件路…

Visual Studio 2022 预览版2 发布啦

我们很高兴地宣布 Visual Studio 2022 的第二个预览版发布啦&#xff01;预览版 1 是有史以来第一个 64 位 Visual Studio&#xff0c;提供了改进的可扩展性。从预览版 2 开始&#xff0c;我们专注于提供有关个人和团队生产力、现代开发和不断创新等主题的新功能。在本文中&…

批作业是小学老师的一大乐趣 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...

第五届外语歌曲大赛如火如荼的进行的听了那么多参赛选手的歌曲自己也不由的也想唱唱正好遇上绫魂论坛的各位管理员为aya筹备生日礼物 好吧~ 我也来小唱一首 小小的final版送上~&#xff08;非正式版 请无视错词和中间以及最后的杂音 灭哈哈&#xff09; 顺便再借用了一下某位选…

免费电影下载

迅雷资源,速度稳定.我一直都在用..好东西不能一个人独享,拿出来分享..菜熊视讯最大的影视迅雷下载站&#xff01;完全免费&#xff0c;并且每天还大批量更新&#xff01;[url]http://www.caixiong.com/?445419.htm[/url]转载于:https://blog.51cto.com/douvip/12485

进入51cto之后的发展方向

这里是个不错的学习环境&#xff0c;值得珍惜。来到这里&#xff0c;我发现这里正是我梦寐以求的学习之天堂&#xff0c;这里可以肆无忌惮的贪婪的学习&#xff0c;可以感受到融洽的美好的氛围。我很愉快的开通的博客&#xff0c;并且珍惜这一次难得的机会去疯狂学习。我要确定…

oracle中文加密算法,Oracle数据库替代加密算法

替代密码算法的原理是使用替代法进行加密&#xff0c;就是将明文中的字符用其它字符替代 后形成密文。例如&#xff1a;明文字母a、b、c、d &#xff0c;用D、E、F、G做对应替换后形成密文。这里在Oracle的存储过程&#xff0c;通过替换加密算法来实现密码存入数据库时的加密。…

.net中单元测试

单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义&#xff0c;一般来说&#xff0c;要根据实际情况去判定其具体含义&#xff0c;如C语言中单元指一个函数&#xff0c;Java里单元指一个类&…

WCF后续之旅(11): 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作&#xff0c;比如异步地进行基于文件系统的IO操作&#xff1b;异步地调用Web Service&#xff1b;或者是异步地进行数据库访问等等&#xff0c;是和具体的线程无关的。也就是说&#xff0c;对于这些操作&#xff0c;任意创建一个新的线程来执行都是等效的。…

成年人改变生活的方式,都是从它开始

全世界只有3.14 % 的人关注了青少年数学之旅2019已经不足80天&#xff0c;年初立下的flag倒了几个&#xff1f;史蒂夫马丁有一句话&#xff1a;“所有的人生谜语都可以从阅读中找到答案。”无论是读影评、读好书&#xff0c;亦或者涉猎趣闻轶事、汲取犀利观点&#xff0c;总会悄…

组策略链接顺序优先级

“链接顺序”最低的 GPO 最后处理&#xff0c;因此具有最高的优先级。

oracle体系结构和组件图示,Oracle 体系结构组件

Oracle数据库主要由两大组件构成&#xff1a;实例&#xff1a;进程与内存结构。数据库&#xff1a;操作系统文件。实例是我们访问数据库的接口。一个实例只能打开一个数据库。当你用SQLPlus或其它的客户端工具去连接Oracle数据库时&#xff0c;你的客户端进程与服务器端进程通讯…

Request.ServerVariables的详细应用(转)

Request.ServerVariables应用 【摘 要】本文详细介绍关于学习ASP知识之Request.ServerVariables应用的文章专题。本机ip:<%request.servervariables("remote_addr")%>服务器名:<%Request.ServerVariables("SERVER_NAME")%>服务器IP:<%Requ…

uiview生命周期

在viewDidAppear方法中做了一段页面开始的动画&#xff0c;但是动画效果在横屏是没有问题的&#xff0c;在竖屏轨迹总是不对。解决方法执行顺序的问题&#xff0c;页面的加载顺序是2011-11-04 13:48:21.290 jjj[4048:707] viewDidAppear2011-11-04 13:48:21.291 jjj[4048:707] …

表白和被表白时遇到的骚操作,最后一个天秀!| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅【1】【2】【3】【4】【5】【6】【7】【8】【9】

oracle中的的instr,Oracle中instr函数使用方法

举例&#xff1a;scenarioinfo 中有60条数据&#xff0c;其中字段ywwd不为空的有40条(其中包含“积分”的有30条)&#xff0c;字段ywwd为空的有20条。查询scenarioinfo 表中字段ywwd包含“积分”的语句(返回30条数据)&#xff1a;select id, ywwd from scenarioinfo where inst…

这么简单的序列化 System.Text.Json.Serialization 也报错了?

咨询区 kofifus&#xff1a;我准备将项目中的 JSON.NET 切换到原生的 System.Text.Json&#xff0c;但我遇到了个意外报错&#xff0c;测试代码如下&#xff1a;using System.Text.Json.Serialization; using Newtonsoft.Json;public class C {public C(string PracticeName) {…

直观机械动图,一秒看懂原理!

全世界只有3.14 % 的人关注了青少年数学之旅这些神奇唯美的机械动图&#xff0c;让我们不得不感叹制造的魅力&#xff01;仿生四翼飞行机器人▲单手磁性拉链▲风洞实验——模拟飞机飞行▲可以说是最快的折弯机了▲这是谁设计的死循环▲高压水除锈▲摩擦焊接▲打地洞▲能轻松把车…