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 类…

Visual Studio 2022 预览版2 发布啦

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

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

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

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

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

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

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

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

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

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

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

这么简单的序列化 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;仿生四翼飞行机器人▲单手磁性拉链▲风洞实验——模拟飞机飞行▲可以说是最快的折弯机了▲这是谁设计的死循环▲高压水除锈▲摩擦焊接▲打地洞▲能轻松把车…

数据校验器架构模式组

刘 岳林 (yuelin_liumsn.com), 软件工程师2007 年 1 月 15 日本文阐述软件架构与设计模式&#xff0c;它为架构师和开发人员提供了一组关于数据校验的架构模式&#xff08;隔离校验器&#xff0c;可组装校验器&#xff0c;动态策略校验器&#xff0c;动态注册校验器等&#xff…

罗斯文2007(Northwind 2007)数据库、Access 2007 样列数据库分析[转]

Northwind 2007 是 MS 的一套销售类样列库&#xff0c;本片文章主要描述&#xff0c;它的结构及关系。 起因:   前些阵子一直想做一个虚拟项目来学习巩固一下 .net3.0 的一些新技术、为什么要做虚拟项目&#xff1f; 当然是系统的学习一些东西了、我对虚拟项目的要求是不能太…

WPF 实现任务栏角徽

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、TaskbarItemInfoExample.xaml代码如下 <Window x:Cla…

竞赛奇葩队名,学编程的人都是隐藏的段子手 | 今日最佳

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

史上最具争议的博弈游戏,我用概率论、博弈论找到了答案

全世界只有3.14 % 的人关注了青少年数学之旅要说最近人气最火热的游戏&#xff0c;莫过于前段时间刚崛起的“多多自走棋”。而关于“多多自走棋 ”被讨论得最多的就是&#xff0c;“到底是靠运气还是技术?”都说吃鸡靠运气&#xff0c;但这些道具加成&#xff0c;在数学计算面…

akka linux 端口,Actor模型开发库 Akka

Akka 是一个用 Scala 编写的库&#xff0c;用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。Actor模型并非什么新鲜事物&#xff0c;它由Carl Hewitt于上世纪70年代早期提出&#xff0c;目的是为了解决分布式编程中一系列的编程问题。其特点如下&#xff1…

简单粗暴的肢体语言解读攻略 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

基于事件驱动架构构建微服务第1部分:应用程序特定的业务规则

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part1-application-specific-business-rules/如今&#xff0c;洋葱或六边形等架构为代码的可测试性和维护、与外部框架的独立性提供了重要帮助。在本教程中&#xff0c;我…

JavaWeb 项目启动时,后台开启一个线程的方法

原文链接&#xff1a;http://blog.csdn.net/it_wangxiangpan/article/details/7168286JavaWeb 服务启动时&#xff0c;在后台启动加载一个线程。目前&#xff0c;我所掌握的一共有两种方法&#xff0c;第一种是监听&#xff08;Listener&#xff09;&#xff0c;第二种是配置随…

linux脚本 逻辑运算,Linux-shell-逻辑运算和;

7.Shell7.5.2命令执行的判断依据&#xff1a; ; , &&, ||1.cmd ; cmd (不考虑指令相关性的连续指令下达)一般用于多条命令之间没有直接需求联系&#xff0c;最多只是有一个执行先后的关系。[rootlocalhost tmp]# sync; shutdown -h now2.与&&或 ||指令下达情况…

我居然从一只猫身上学到了斐波那契数列

猫的数学这么好是有原因的斐波那契数列&#xff08;Fibonacci sequence&#xff09;是由数学家列昂纳多斐波那契定义的把它写成数列的形式是这样的&#xff1a;1,1,2,3,5,8,13,21,34,55,89,...比如&#xff1a;人的耳朵比如&#xff1a;台风比如&#xff1a;松果的底部螺纹从两…