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中列表对象多条件排序的更多相关文章
-
JSON的String字符串与Java的List列表对象的相互转换
1.JSON的String字符串与Java的List列表对象的相互转换 在前端: 1.如果json是List对象转换的,可以直接遍历json,读取数据. 2.如果是需要把前端的List对象转换为jso ...
-
Java 开发中的对象拷贝
前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...
-
C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...
-
面试题:JVM在Java堆中对对象的创建、内存结构、访问方式
一.对象创建过程 1.检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载.解析.初始化,若没有,则进行类加载 ...
-
java内存中的对象
前记:几天前,在浏览网页时偶然的发现一道以前就看过很多遍的面试题,题目是:“请说出‘equals’和‘==’的区别”,当时我觉得我还是挺懂的,在心里答了一点(比如我们都知道的:‘==’比较两个引用是否 ...
-
java list中的对象,按对象某属性排序
1:对象类 需要 实现: public class TreeNode extends BaseBean implements Comparable <TreeNode> { private ...
-
java根据list中的对象某个属性排序
1. Collections.sort public class Test { public static void main(String[] args) throws Exception { Ci ...
-
List集合中的对象根据属性排序
集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...
-
java list中的对象去重原理
/******************************************************************************* * * Copyright (c) W ...
随机推荐
-
电脑文件出现“windows-文件发生意外问题-可修复(严禁修改)-错误代码0X00000BF8”错误,怎么办
电脑文件出现"windows-文件发生意外问题-可修复(严禁修改)-错误代码0X00000BF8"错误,怎么办 下载一个"纵情文件修复器"修复一下就可以了 下载 ...
-
WORD神操作!第一个技巧你就傻眼了!
原文:http://mp.weixin.qq.com/s?__biz=MzA4NzkyMDIwNw==&mid=220128483&idx=4&sn=cfa87c941f36f ...
-
转载-优秀程序员的十个tips
理解技术债务 技术债务就像信用卡一样,会有很高的利息,时间越长,修复所化的代价就越大.团队应该培养一种保证设计质量的文化,鼓励重构.同时应当鼓励其它有关代码质量的实践. 保持对原理的好奇心 做Andr ...
-
Dedecms当前位置{dede:field name=&#39;position&#39;/}修改
这个实在list_article.htm模板出现的,而这个模板通过loadtemplage等等一系列操作是调用的include 下的arc.archives.class.php $this->F ...
-
《Java4Android视频教程》学习笔记(二)
一:面向对象 1.对象 ①对象的使用方法 对象.变量 对象.方法 ②匿名对象 new A().方法 new A().变量 匿名对象会被分配到对内存中 java内存处理机制会对一定时间内无指针指向的对象 ...
-
(转) Eclipse Maven 编译错误 Dynamic Web Module 3.1 requires Java 1.7 or newer 解决方案
场景:在导入Maven项目时候遇到如下错误. 1 问题描述及解决 Eclipse Maven 开发一个 jee 项目时,编译时遇到以下错误:Description Resource Path Loca ...
-
Eclipse工具常用快捷键
Eclipse工具常用快捷键 一丶文件菜单常用快捷键 新建 Alt + shift + N 关闭当前编辑器 Ctrl +W 全部关闭 Ctrl + shift + w 保存 Ctrl + s 刷新 ...
-
go 语言图片像素点处理
将一张图片色彩反转,就是将 rgb 值,分别被 255 减 package main import ( "bytes" "fmt" "image&q ...
-
array_walk与array_map的区别
1.array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的只能用array_walk($aIds ...
-
转:jsp内置对象中page与pageContext与el内置对象pageScope与pageContext区别
原文地址:jsp内置对象中page与pageContext与el内置对象pageScope与pageContext区别 首先说明一下jsp9大内置对象 (1)HttpSession类的session对 ...