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. CentOS下Crontab安装使用详细说明(转)

    来自:http://www.centoscn.com/CentOS/help/2014/1220/4346.html crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的 ...

  2. HTML5开发之获取设备的地理坐标

    近期一段时间開始学一下html5,发现里面有好多的知识还是蛮新颖的.所以整理了一下自己练习过的demo给大家分享下,以下的代码是通过js接口获取当前的地理坐标. <!doctype html&g ...

  3. 索引唯一性扫描(INDEX UNIQUE SCAN)

           索引唯一性扫描(INDEX UNIQUE SCAN)是针对唯一性索引(UNIQUE INDEX)的扫描,它仅仅适用于where条件里是等值查询的目标SQL.因为扫描的对象是唯一性索引,所 ...

  4. java.lang.NoClassDefFoundError: Ljavax/transaction/TransactionManager

    网上下载一个 jta.jar包 放到项目 的WebRoot 的lib文件夹下,解决.

  5. [Android]Recovery调用外部Shell脚本,Shell脚本使用ui_print方法

    busybox_bin=/sbin/busybox # 获取PIPE get_outfd(){ | $busybox_bin grep -q 'pipe'; then else local all_p ...

  6. 转 configure: error: Cannot find ldap libraries in /usr/lib 解决办法

    今天在centos 6.2 64位版本上安装LNMP,config php的时候出现下面错误而退出 configure: error: Cannot find ldap libraries in /u ...

  7. windows下卸载mysql5.5,升级为mysql5.7.25

    0. 停止mysql的服务 1. 卸载mysql5.5 1.1 使用360或者控制面板卸载mysql,为求干净,我使用的360,结果也需要手动清理 1.2 卸载完成之后到mysql的安装目录删掉该目录 ...

  8. Docker 技巧:删除 Docker 所有镜像

    删除所有未运行 Docker 容器 docker rm $(docker ps -a -q) 删除所有 Docker 镜像 删除所有未打 tag 的镜像 docker rmi $(docker ima ...

  9. 用@resource注解方式完成属性装配

    注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 1 需要修改xml文件的以下信息.    加入下列红色部分的4行 & ...

  10. sqlserver查询数据表中每个类别最新的一条记录

    表tariff_info, 原始数据: 想要的结果:以start_time时间倒序排序, 以code分类, 查询每一类最新的一条记录 sql: SELECT a.* FROM TARIFF_INFO ...