对一个字符串数组排序
首先生成一个字符串数组
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
方法1 method reference
Arrays.sort(stringArray, String::compareToIgnoreCase);
for(String s: stringArray)
System.out.print(s + " ");
方法2 lambda
通过在comparator(functional interface) 出使用lambda expression来进行排序
funtional interface, 只有一个abstract method,但是可以有多个default 以及static。这里也是体现了java interface的意义,即告诉coder这个函数是干嘛。打个比方,你看到KFC的招牌就知道里面是卖炸鸡的,不管后来在任何城市国家都是这样。但是假如没有这块KFC的招牌,你每次进去都要问,有没有炸鸡,有没有甜筒,有没有汉堡…尽管每个KFC店做的口味(function behaviour)不同,但是你还是知道这就是junk food
Arrays.sort(stringArray,(a,b)->{return -a.compareTo(b);});
for(String s: stringArray)
System.out.print(s + " ");
Sys.out.println();
方法3 # class
为什么叫anonymous呢,因为他没有“名字”。
首先,我们要发现,这个叫“class”而不是”interface“了。假如不采用这种方法,我们需要先把comparator继承,然后再实例化,匿名类帮我们省去了这个过程。他直接使用interface,或者将interface储存在一个variable中
Comparator c = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
Arrays.sort(stringArray,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
import java.util.function
这里包含了大量functional interface
这里再补充一个lambda使用的例子
package lamdba;
import java.util.Arrays;import java.util.Comparator;
import java.util.function.Consumer;
// 自己定义一个generic functional interface
@FunctionalInterface
interface f<T>{
void apply(T t);
}
public class LambdaScopeTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
// The following statement causes the compiler to generate
// the error "local variables referenced from a lambda expression
// must be final or effectively final" in statement A:
//
//x = 99;
// 如果有了上面的x = 99,下面会报错,因为x必须是final类型,anonymous class 传入的参数也不能叫“x”
f<Integer> tF = Z -> {System.out.println(Z*x);};
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x); // Statement A
System.out.println("y = " + y);
System.out.println("this.x = " + this.x);
System.out.println("LambdaScopeTest.this.x = " +
LambdaScopeTest.this.x);
};
myConsumer.accept(x);
tF.apply(10);
}
}
public static void main(String... args) {
LambdaScopeTest st = new LambdaScopeTest();
LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}