本篇将讲述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的更多相关文章

  1. Java8 Lamdba表达式 001

    在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性.Lambda表达式对于Java语言就是这样的意义的存在.简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能.提供了一 ...

  2. java8中对lamdba表达式方法参数传递时,方法重载之后的类型推断

    java8中可以向方法传递一个lamdba表达式,今天看书关于类型推断碰到一个问题: 这个问题我实际操作了一下:得出结论 如果是只有一个方法的情况下,方法参数使用lamdba表达式的时候是不需要写类型 ...

  3. Java8 新特性 Lamdba表达式

    Lamdba 表达式为什么出现   Java8是自java延生以来最大的改变,他允许java中的方法和函数成为一等公民(可以在方法间传递),所以就应运而出现了Lamdba表达式,他可以将表达式传递给另 ...

  4. Java8 Lumbda表达式 初步

    Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...

  5. java8 Lambda表达式的新手上车指南(1)

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  6. Java8 Lambda表达式原理扫盲

    背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了. 正文 ...

  7. C#3.0 Lamdba表达式与表达式树

    Lamdba表达式与表达式树 Lamdba表达式 C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案. lamdba的行为 ...

  8. java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  9. C#高级编程9-第8章 委托、lamdba表达式和事件

    委托.lamdba表达式和事件 1.引用方法 函数指针是一个指向内存位置的指针,不是类型安全的.无法判断实际指向.参数和返回类型也无从知晓..NET委托是类型安全的.定义了返回类型和参数类型,不仅包含 ...

随机推荐

  1. elementUI 日期时间选择器el-date-picker开始时间与结束时间约束

    主要思路:el-date-picker组件需要 :picker-options属性,属性值为data,data的数据来自于methods中的方法. ##template代码 <el-form-i ...

  2. 2015 Multi-University Training Contest 7 hdu 5372 Segment Game

    Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  3. 2015 Multi-University Training Contest 7 hdu 5379 Mahjong tree

    Mahjong tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. Android Touch事件传递机制全面解析(从WMS到View树)

    转眼间近一年没更新博客了,工作一忙起来.非常难有时间来写博客了,因为如今也在从事Android开发相关的工作,因此以后的博文也会很多其它地专注于这一块. 这篇文章准备从源代码层面为大家带来Touch事 ...

  5. Swift开发教程--怎样使UITableViewController背景透明

    self.tableView.backgroundView? .backgroundColor = UIColor.clearColor(); self.tableView.backgroundCol ...

  6. 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)

    一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...

  7. LeetCode——Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  8. Java -- XML解析工具dom4j

    前言 XML现已成为一种通用的数据交流方式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便,对于XML的解析有四种方式:DOM生成和解析XML文档,SAX生成和解析XML文件 ...

  9. Java中异常处理之try和catch代码块的使用

    转自:https://www.jb51.net/article/72901.htm Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自 ...

  10. xBIM 高级03 更改日志创建

    系列目录    [已更新最新开发文章,点击查看详细]  模型中发生的每一个变化都是事务的一部分,这是我们设计的核心.所有事务都是由 IModel 的实现创建的,并且从中被弱引用,因此当使用 using ...