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。然后根据byGoals生成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~

时间: 2024-08-25 10:55:11

Java8 Lamdba表达式 002的相关文章

Java8 Lamdba表达式 003

继续lamdba.上篇Java8 Lamdba表达式 002讲了使用lamdba对集合元素进行排序,本篇讲述使用lamdba对集合元素过滤,演示样例代码沿用上篇: 001 public class SortingPlayer { public static void main(String[] args) { List<Player> playerList = new ArrayList<>(); playerList.add(new Player("Black"

Java8 Lamdba表达式 001

在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性.Lambda表达式对于Java语言就是这样的意义的存在.简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能.提供了一个简单的方式使用表达式或一系列的状态创建一个简单方法.Lambda表达式是包括一个抽象方法的接口.Lamdba表达式能够用来创建简单的匿名功能来实现对集合元素的排序和过滤,还能分配变量并传递到其它对象中.等等.以下将结合样例来加深大家对Lamdba的理解. 首先讲一下安装配置 要想使用Lamdba,

Java8 Lambda表达式深入学习(4) -- Java8实现方式

前几篇文章讨论了函数式接口和Lambda表达式语法.invokedynamic指令,以及Groovy2如何利用indy指令.本篇文章在前面几篇的基础之上,简要介绍Java8底层是如何实现Lambda表达式的. 示例代码 本文将以下面的代码为例展开讨论: import java.util.Arrays; import java.util.List; public class LambdaImplTest { public static void main(String[] args) { m1(A

java8 lambda表达式初接触

环境是jdk8 代码如下: package memTest; /** * Created by PC on 2014/8/5. */ public class LambdaOne { public static void test(){ new Thread(()-> System.out.print("hi") ).start(); } public static void main(String[] args) { new LambdaOne().test(); } } ja

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

c#Lamdba表达式与托付

介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,能够包括表达式和语句,而且可用于创建托付或表达式文件夹树类型. 怎样创建 格式:( 形參列表 ) => { 函数体 } 若要创建 Lambda表达式,须要在 Lambda运算符=>左側指定输入參数(假设有),然后在还有一側输入表达式或语句块.比如,lambda表达式 x => x * x指定名为 x的參数并返回 x的平方

回调与Java8的λ表达式

[9.3.1 回调]中,介绍了回调和<a target=_blank href="http://blog.csdn.net/yqj2065/article/details/8758101">好莱坞原则 (Java中)回调与通常的(遵循OCP 代码的)非回调代码,使用的技术不过是动态绑定/多态. 回调与通常的非回调代码,从类图和其自身代码上,没有区别. 之所以需要回调callback.隐式调用Implicit invocation(某些软件架构的作者使用的术语),是因为分层结

c#Lamdba表达式与委托

介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 如何创建 格式:( 形参列表 ) => { 函数体 } 若要创建 Lambda表达式,需要在 Lambda运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda表达式 x => x * x指定名为 x的参数并返回 x的平方值.

java8 lambda表达式的一些用法

用 lamdba 表达式操作 对象集合的比较 优雅.代码也比较简洁. 希望大家掌握(可以避免写foreach 循环). 下面是实例代码(入门级,需要高级应用,自己得百度或者研究了) /** * Project Name:test * File Name:myTest.java * Package Name:test * Date:2016年8月15日下午5:39:50 * Copyright (c) 2016, [email protected] All Rights Reserved. * *