Java字符串数组排序

对一个字符串数组排序

首先生成一个字符串数组

String[] stringArray = { "Barbara", "James", "Mary", "John",
    		    "Patricia", "Robert", "Michael", "Linda" };

方法1 method reference

Java doc中对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() {
			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				return o1.compareTo(o2);
			}
    	Arrays.sort(stringArray,new Comparator() {

			@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{
	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 tF = Z -> {System.out.println(Z*x);};
        	
            Consumer 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);
    }  	
}

你可能感兴趣的:(JAVA基础)