Java字符串数组排序

本文介绍了三种对Java字符串数组进行排序的方法:方法1利用method reference,方法2使用lambda表达式,方法3则是通过匿名类实现。详细阐述了每种方法的原理和使用场景,并提到了`java.util.function`包中的functional interfaces在排序中的应用。
摘要由CSDN通过智能技术生成

对一个字符串数组排序

首先生成一个字符串数组

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<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);
    }  	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值