本篇将讲述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. JSp获取到当前用户的全部session

    <%@page import="java.util.Enumeration"%> <% for (Enumeration<?> e = session ...

  2. 《你又怎么了我错了行了吧团队》第七次作业:团队项目完善&编码

    <你又怎么了我错了行了吧团队>第七次作业:团队项目完善&编码 项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十一 团队名称 你又怎么了我错了行了吧 作业学习 ...

  3. Shiro:初识Shiro及简单尝试

    Shiro 一.什么是Shiro Apache Shiro是Java的一个安全(权限)框架 作用:认证.授权.加密.会话管理.与web集成.缓存等 下载地址:http://shiro.apache.o ...

  4. 楼宇自控-BA系统流程总图

    总结一下过程中的节点和技能,希望能对其他人有所帮助

  5. [Tools] Using mobile device for debugging your mobile web site

    1. First you have enable "Developer mode" on your mobile device. (Different device might b ...

  6. 数据库中的java.sql.Timestamp转换成Date

    查询数据库中的时间类型为 java.sql.Timestamp 保存在json中需要格式化 自定义工具类  DateJsonValueProcessor package com.rom.util; i ...

  7. 30个php操作redis经常用法代码样例

    这篇文章主要介绍了30个php操作redis经常用法代码样例,本文事实上不止30个方法,能够操作string类型.list类型和set类型的数据,须要的朋友能够參考下 redis的操作非常多的,曾经看 ...

  8. poj_1952最大下降子序列,统计个数

    其实不算难的一道题,但憋了我好久,嗯,很爽. #include<iostream> #include<cstdio> #include<string.h> #inc ...

  9. Default Document <defaultDocument> IIS中的默认页面

    https://docs.microsoft.com/en-us/iis/configuration/system.webserver/defaultdocument/index Default do ...

  10. hdoj--1950--Bridging signals(二分查找+LIS)

    Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...