Java8 Lamdba表达式 002
本篇将讲述lamdba表达式的排序,本例包括一个Player对象的集合[稍后定义],通过每一个player的分数高低对列表的player进行排序。类定义001例如以下
public class SortingPlayer { public static void main(String[] args) {
List<Player> playerList = new ArrayList<>();
playerList.add(new Player("Black", "White", 9));
playerList.add(new Player("John", "Hello", 2));
playerList.add(new Player("Machicel", "Jackson", 7));
playerList.add(new Player("Ani", "Hessius", 4));
playerList.add(new Player("Mark", "Towns", 3));
playerList.add(new Player("Huge", "Nana", 6));
}
} class Player{
private String firstName;
private String lastName;
private int goals; public Player(String firstName, String lastName, int goals) {
this.firstName = firstName;
this.lastName = lastName;
this.goals = goals;
} 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 getGoals() {
return goals;
}
public void setGoals(int goals) {
this.goals = goals;
}
}
简单起见把代码写在一个类里,Player定义了firstname,lastname,goals,Main方法 创建一个集合并往当中加入了几个元素。
002以下的代码在加入在001main方法list后
Comparator<Player> byGoals = Comparator.comparing(Player::getGoals);
System.out.println("== Sort by Number of Goals ==");
playerList.stream().sorted(byGoals)
.map(p -> p.getFirstName() + " " + p.getLastName() + " - "
+ p.getGoals())
.forEach(element -> System.out.println(element));
使用Player对象的getter方法[依据你想排序的那个字段。本例使用goals]创建一个Comparator - Player::getGoals 。然后使用混合的lamdba表达式和streams,forEach()。展示排序后的集合。
java8中集合排序又新加了能够极大提高开发效率的3个新特性。
各自是lamdba表达式,方法引用以及stream。对于方法引用和stream这里仅仅做简介,Stream能够在集合数据[collections]中使用,它同意集合中的元素进行函数式操作。Stream不存储数据。它能让获得的集合具有很多其它功能。
002中,Comparator依据计算的goals生成,Player::getGoals。然后依据playerList生成stream。stream提供sorted()功能,它接收一个Comparator,Comparator在传递给sorted()时已经完毕初始化,然后调用map()功能,map使用一个lamdba表达式拼一个firstname,lastname,&goals的字符串。最后因为List<Player>是可迭代的,它包括forEach()方法,forEach()方法同意集合中的每一个元素应用表达式或状态组。本例中。每一个元素都在命令行打印,因为map()功能已经在stream中应用,因此最后结果是打印依照goals排好序的每一个元素的firstname,lastname,&goals拼的字符串。例如以下所看到的:
== Sort by Number of Goals ==
John Hello - 2
Mark Towns - 3
Ani Hessius - 4
Huge Nana - 6
Machicel Jackson - 7
Black White - 9
除了使用002所看到的的方法进行排序。我们还能够使用Collections集合提供的sort()方法:Collections.sort(),见003
System.out.println("== utilize the Collections.sort()method ==");
Collections.sort(playerList, (p1,p2)
-> p1.getLastName().compareTo(p2.getLastName()));
playerList.stream().forEach((p) -> {
System.out.println(p.getLastName());
});
003中 Collections.sort()第一个參数是要排序的集合本身List<Player>,第二个參数是排序的lamdba实现。本例中传入两个參数都是Player对象。比較他们的lastname,因此这个排序将会对集合元素的lastname进行升序排序。排序后生成stream然后forEach使用lamdba表达式打印出排序后集合每一个元素的lastname。例如以下所看到的:
== utilize the Collections.sort()method ==
Hello
Hessius
Jackson
Nana
Towns
White
无疑。lamdba表达式极大的降低了集合排序所需的代码。并且使代码更易读。本篇说到这儿。很多其它特性。下回分解。
ps:本文演示样例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition
mission completed!
O(∩_∩)O~
Java8 Lamdba表达式 002的更多相关文章
- Java8 Lamdba表达式 001
在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性.Lambda表达式对于Java语言就是这样的意义的存在.简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能.提供了一 ...
- java8中对lamdba表达式方法参数传递时,方法重载之后的类型推断
java8中可以向方法传递一个lamdba表达式,今天看书关于类型推断碰到一个问题: 这个问题我实际操作了一下:得出结论 如果是只有一个方法的情况下,方法参数使用lamdba表达式的时候是不需要写类型 ...
- Java8 新特性 Lamdba表达式
Lamdba 表达式为什么出现 Java8是自java延生以来最大的改变,他允许java中的方法和函数成为一等公民(可以在方法间传递),所以就应运而出现了Lamdba表达式,他可以将表达式传递给另 ...
- Java8 Lumbda表达式 初步
Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- Java8 Lambda表达式原理扫盲
背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了. 正文 ...
- C#3.0 Lamdba表达式与表达式树
Lamdba表达式与表达式树 Lamdba表达式 C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案. lamdba的行为 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- C#高级编程9-第8章 委托、lamdba表达式和事件
委托.lamdba表达式和事件 1.引用方法 函数指针是一个指向内存位置的指针,不是类型安全的.无法判断实际指向.参数和返回类型也无从知晓..NET委托是类型安全的.定义了返回类型和参数类型,不仅包含 ...
随机推荐
- 炫酷 CSS 背景效果的 10 个代码片段
在现代网页设计中,大背景图设计非常流行.随着高清(现在是4K)显示器的出现,越来越多的网页设计师使用大背景图来填充屏幕. 因为这样可以造成很大的视觉冲击力,并有助于更好的传递所要表现的内容. 但是,如 ...
- 数据库ifnull方法
IFNULL(expr1,expr2)如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值.例如: ifnull() 如果sum(t ...
- java中 flush()方法的作用
flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...
- Git学习总结(10)——git 常用命令汇总
1.git 基本概念: 工作区:改动(增删文件和内容) 暂存区:输入命令:git add 改动的文件名,此次改动就放到了'暂存区'(新增的文件) 本地仓库(简称:本地):输入命令:git commit ...
- java内存管理之内存模型
1,运行时数据区域 1. 程序计数器 (program counter register) 2. Java虚拟机栈 (jvm stack) 3. 本地方法栈 (native method stack) ...
- 初识BeeFramework
由于近期的项目须要,Hybrid开发成为我開始学习的新知识.非常早之前就了解到两个开发框架--BeeFramework 和 Samurai,可是由于本人一直没有闲暇去研究,所以就一直搁置一旁了.近期才 ...
- Oracle GoldenGate
Oracle GoldenGate实现数据库同步 前言:最近刚好在弄数据库同步,网上查了些资料再加上自己整理了一些,做个分享! 一.GoldenGate的安装 官方文档: Oracle®GoldenG ...
- 带你玩转Visual Studio——带你理解多字节编码与Unicode码
目录(?)[-] 多字节字符与宽字节字符 char与wchar_t string与wstring string 与 wstring的相关转换 字符集Charcater Set与字符编码Encoding ...
- js中cookie的使用 以及缺点
什么是Cookie Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制.目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox. ...
- SAS拆分数据集
2012年8月8日 主要是根据选取条件来进行拆分 1.根据行数来选: data test; set oldset; if _n_=10 then output; if id="001&quo ...