能用一个变量java8 的“方法引用”吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了能用一个变量java8 的“方法引用”吗相关的知识,希望对你有一定的参考价值。
在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。
Arrays.sort(stringsArray, String::compareToIgnoreCase);
这种特性就叫做方法引用(Method Reference)。
方法引用的形式
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
有以下四种形式的方法引用:
类型
示例
引用静态方法
ContainingClass::staticMethodName
引用某个对象的实例方法
containingObject::instanceMethodName
引用某个类型的任意对象的实例方法
ContainingType::methodName
引用构造方法
ClassName::new
下面我们通过一个小Demo来分别学习这几种形式的方法引用:
public class Person
public enum Sex
MALE,FEMALE
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
public String getEmailAddress()
return emailAddress;
public Sex getGender()
return gender;
public LocalDate getBirthday()
return birthday;
public String getName()
return name;
public static int compareByAge(Person a,Person b)
return a.birthday.compareTo(b.birthday);
引用静态方法
Person [] persons = new Person[10];
//使用匿名类
Arrays.sort(persons, new Comparator<Person>()
@Override
public int compare(Person o1, Person o2)
return o1.birthday.compareTo(o2.birthday);
);
//使用lambda表达式
Arrays.sort(persons, (o1, o2) -> o1.birthday.compareTo(o2.birthday));
//使用lambda表达式和类的静态方法
Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));
//使用方法引用
//引用的是类的静态方法
Arrays.sort(persons, Person::compareByAge);
引用对象的实例方法
class ComparisonProvider
public int compareByName(Person a,Person b)
return a.getName().compareTo(b.getName());
public int compareByAge(Person a,Person b)
return a.getBirthday().compareTo(b.getBirthday());
ComparisonProvider provider = new ComparisonProvider();
//使用lambda表达式
//对象的实例方法
Arrays.sort(persons,(a,b)->provider.compareByAge(a,b));
//使用方法引用
//引用的是对象的实例方法
Arrays.sort(persons, provider::compareByAge);
引用类型对象的实例方法
String[] stringsArray = "Hello","World";
//使用lambda表达式和类型对象的实例方法
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
//使用方法引用
//引用的是类型对象的实例方法
Arrays.sort(stringsArray, String::compareToIgnoreCase);
引用构造方法
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>>
DEST transferElements(SOURCE sourceColletions, Supplier<DEST> colltionFactory)
DEST result = colltionFactory.get();
for (T t : sourceColletions)
result.add(t);
return result;
...
final List<Person> personList = Arrays.asList(persons);
//使用lambda表达式
Set<Person> personSet = transferElements(personList,()-> new HashSet<>());
//使用方法引用
//引用的是构造方法
Set<Person> personSet2 = transferElements(personList, HashSet::new); 参考技术A 方法引用不能像javascript一样赋给一个变量,只能调用。
java变量命名中为啥能用中文
因为Java支持UnicodeJava的class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是unicode编码的。总之,Java采用了unicode字符集,使之易于国际化。 参考技术A 1.java是外国人开发的,当然不会考虑用中文
2.凭心而论,中文不太适合计算机编程,会带来许多不便,比如乱码(在web中表现很明显)
3.计算机编程语言应该是是世界通用的,那除了英文,还有别的更合适的么? 参考技术B 人家就那么要求的 你要写中文 人家就按乱码算了 参考技术C 可以用汉字命名变量名,我试过了. 参考技术D Java用的是unicode编码
以上是关于能用一个变量java8 的“方法引用”吗的主要内容,如果未能解决你的问题,请参考以下文章