Java8 Lamdba表达式 002

来源:互联网 发布:幼儿园主题网络构图 编辑:程序博客网 时间:2024/04/30 02:02

本篇将讲述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 - 2Mark Towns - 3Ani Hessius - 4Huge Nana - 6Machicel Jackson - 7Black 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 ==HelloHessiusJacksonNanaTownsWhite
无疑,lamdba表达式极大的减少了集合排序所需的代码。而且使代码更易读。本篇讲到这儿。更多特性,下回分解。

ps:本文示例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition

mission completed!

O(∩_∩)O~




0 0
原创粉丝点击