java 8 新加了 lambda 表达式,当接口是一个 @FunctionalInterface 时可以使用 lambda 表达式代替

Function典型的应用场景为:A. 1个只有1个方法的接口,避免写匿名类; B. 接受Fuction接口为参数的方法

1 lambda 函数式编程特性

函数式接口:Functional Interface. 
定义的一个接口,接口里面必须 有且只有一个抽象方法 ,这样的接口就成为函数式接口。 
在可以使用lambda表达式的地方,方法声明时必须包含一个函数式的接口。

函数式编程的格式如下几种方式:
    a. 标准方式
    (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }

b.省略类型
    (param1,param2, ..., paramN) -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }
    
    c.参数为1个时,可用省略参数小括号
    param1 -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }
    
    d. 语句只有一条时,可省略语句大括号
    param1 -> statment

2. 方法引用

如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。 
Comparator byName = Comparator.comparing(Person::getName); 
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
类型     示例
引用静态方法     ContainingClass::staticMethodName
引用某个对象的实例方法     containingObject::instanceMethodName
引用某个类型的任意对象的实例方法     ContainingType::methodName
引用构造方法     ClassName::new
    
静态方法引用例子:

  String::valueOf   等价于lambda表达式 (s) -> String.valueOf(s)

  Math::pow       等价于lambda表达式  (x, y) -> Math.pow(x, y);

3 Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:

Predicate<T>——接收T对象并返回boolean
Consumer<T>——接收T对象,不返回值
Function<T, R>——接收T对象,返回R对象
Supplier<T>——提供T对象(例如工厂),不接收值
UnaryOperator<T>——接收T对象,返回T对象
BinaryOperator<T>——接收两个T对象,返回T对象

那么在参数为这些接口的地方,我们就可以直接使用lambda表达式了!

4 简单例子

Person 类有 name、age

import org.apache.commons.lang3.builder.ToStringBuilder;
import com.huitong.actdemo1.util.PinyinUtil;
public class Person { private String name;
private Integer age; public Person() {
} public Person(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
} public String getNamePinyin() {
return PinyinUtil.toPinyin(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

现在要一个需求,一个List 先按照名字的拼音排序,然后按照年龄排序

public static void main(String[] args) {

        List<Person> persons = getPersons();

        long start = System.currentTimeMillis();
// List<Person> result = persons.stream().sorted(Comparator.comparing(Person::getNamePinyin).thenComparing(Person::getAge)).collect(Collectors.toList());
List<Person> result = persons.stream()
.sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
.thenComparing(Person::getAge)).collect(Collectors.toList());
long end = System.currentTimeMillis(); System.out.println("duration time:" + (end-start) + "ms"); for(Person p: result) {
System.out.println(p);
} } public static List<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("中国", ));
persons.add(new Person("中国", ));
persons.add(new Person("中国", ));
persons.add(new Person("美国", ));
persons.add(new Person("泰国", ));
persons.add(new Person("韩国", ));
persons.add(new Person("日本", )); return persons;
}

两种方法都可以。

Comparator.comparing()方法接受一个 Function 参数,可以使用lambda 表达式、也可以使用方法引用方式。

参考文献:

https://blog.csdn.net/blacksoil55/article/details/78359045

https://blog.csdn.net/jinzhencs/article/details/50748202

java 8中列表对象多条件排序的更多相关文章

  1. JSON的String字符串与Java的List列表对象的相互转换

    1.JSON的String字符串与Java的List列表对象的相互转换 在前端: 1.如果json是List对象转换的,可以直接遍历json,读取数据. 2.如果是需要把前端的List对象转换为jso ...

  2. Java 开发中的对象拷贝

    前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...

  3. C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序

    借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...

  4. 面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

    一.对象创建过程 1.检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载.解析.初始化,若没有,则进行类加载 ...

  5. java内存中的对象

    前记:几天前,在浏览网页时偶然的发现一道以前就看过很多遍的面试题,题目是:“请说出‘equals’和‘==’的区别”,当时我觉得我还是挺懂的,在心里答了一点(比如我们都知道的:‘==’比较两个引用是否 ...

  6. java list中的对象,按对象某属性排序

    1:对象类 需要 实现: public class TreeNode extends BaseBean implements Comparable <TreeNode> { private ...

  7. java根据list中的对象某个属性排序

    1. Collections.sort public class Test { public static void main(String[] args) throws Exception { Ci ...

  8. List集合中的对象根据属性排序

    集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...

  9. java list中的对象去重原理

    /******************************************************************************* * * Copyright (c) W ...

随机推荐

  1. python的traceback模块

    import traceback try: 1/0 except Exception,e: traceback.print_exc() 输出结果是 Traceback (most recent cal ...

  2. Android学习笔记四:activity的四种启动模式

    Activity有四种启动模式:standard,singleTop,singleTask,singleInstance. 1.standard:标准启动模式 默认模式,这个模式下启动的Activit ...

  3. JSP之include动态包含与静态包含

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6044676.html JSP中,include是一个经常用到的标签.当应用程序中所有的页面的某些部分(如标题. ...

  4. Linux(centos)新建,删除,移动,重命名文件夹和文件的命令

    1.新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir /home/test 2.新建文本 在home下新建一个test.sh脚本 vi / ...

  5. 4、redis之使用commons-pool

    增加池的配置文件redis-pool.properties: #最大能够保持idel状态的对象数 redis.pool.maxIdle=200 #当池内没有返回对象时,最大等待时间 redis.poo ...

  6. C# 7 out variables, tuples & other new features

    C# 7 out variables, tuples & other new features C# 7 is available on new Visual Studio 2017 and ...

  7. Android ListView之选中(撤销选中)Item

    在ContactListActivity中,点击未选中的item将其选中,再点击已选中的item撤销其选中 public void onItemClick(AdapterView<?> p ...

  8. ios实例开发精品文章推荐(8.5)

    IOS基础知识记录 IOS基础知识记录一        http://www.apkbus.com/android-131902-1-1.htmlIOS基础知识记录二        http://ww ...

  9. linux shell 脚本攻略学习15--如何只列出目录,如何快速切换目录

    工作中经常遇到关于目录方面的问题,例如,如何只列出当前目录下的所有目录,以及如何快速高效的切换目录,而不需要使用鼠标,下面将简单介绍关于这两方面的解决方案: 一.如何只列出目录? 看似简单的任务,其实 ...

  10. 关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明

    关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明 1. mod_evasive 介绍: mod_evasive 是Apache(httpd)服务器的防DDOS的一个 ...