JAVA8新特性--lambda表达式结合泛型的简单应用

JAVA8新特性–lambda表达式结合泛型的简单应用

本篇文章将介绍小编对java8新特性–lambda表达式的理解,以及java5后引入的泛型的理解。随后介绍将lambda表达式结合泛型的实践。

lambda表达式

小编查阅了很多博客,总结一下:
1、lambda表达式最初java并不会支持,其实现形式与C++的指针相似;
2、java8之前的版本采用匿名内部类来代替lambda表达式;

知识延伸:
匿名内部类:java中有些类只用一次,因此java提出了匿名内部类new一次使用完了就不再使用。匿名内部类实现一个接口或继承一个类,可以继承或覆写父类的方法。由于匿名内部类不能直接被外部使用,所以只能继承或覆写父类方法,即使实现其他方法,只能是在继承或覆写父类方法中去调用

lambda表达式的定义及使用:
lambda表达式语法: 参数 -> 具体的实现
函数式接口的方法叫做函数描述符,lambda表达式的参数和实现必须和函数描述符的参数和返回值一一对应;
lambda表达式的简单应用,小编在此不做过多介绍,此类博客很多。

泛型

泛型的使用非常广泛,小编了解的程度并不深入,基本理解:泛型可以在类、方法、接口中使用,泛型最重要的是定义,我们在创建一个泛型类、泛型接口、泛型方法时,类与接口名后要定义泛型,泛型方法在定义返回类型时要定义泛型。
eg:
泛型类:

public class Generic<T>{ 
	// 1、由于泛型类在声明时已定义了泛型,因此该类中的泛型方法不需要定义泛型
	// 2、泛型类中可以定义非泛型方法
}

泛型接口:

public interface Generic<T> {
	// 泛型接口与泛型类的定义和使用基本相同,同上。
}

泛型方法:

// 泛型方法可以定义在泛型类中,也可以定义在非泛型类中
定义在泛型类:
public class Generic<T>{ 
	public boolean  getMax(T t1, T t2){
		if (t1.compareTo(t2) > 0) {
			return true;
		} else {
			return false;
		}
	}
}

定义在非泛型类:

public class Generic {
	public <T extends Compareble<? super T>> boolean  getMax(T t1, T t2){
		if (t1.compareTo(t2) > 0) {
			return true;
		} else {
			return false;
		}
	}
}

注:泛型使用时需要传入具体的参数类型。

lambda表达式和泛型函数式接口的结合

从小标题中小编特意强调泛型函数式接口,因为如果普通函数式接口中定义了泛型抽象方法,在我们使用lambda表达式时,idea会报错**“target method is generic”**,编译,会报“参数不匹配; 无法推断lambda.SortInterface的函数接口描述符”,原因:函数式接口中定义的泛型方法时,接口必须要定义泛型。网上搜索发现,java中自带支持lambda表达式的函数式接口,方法为泛型其接口一定定义了泛型。不要纠结为什么,这就是新特性的规则,规则这东西适应了就好,毕竟我们不是定规则的人。

public interface SortInterface<T> { // 定义泛型
    List<T> sort(List<T> list);
}
public class SortManage {
    public <T extends Comparable<? super T>> List<T> getSortedList(List<T> list, SortInterface<T> sortInterface) {
        return sortInterface.sort(list);
    }
}
public class ClientDriverTest {
    public static void main(String args[]) {
        List<Integer> list = Stream.of(1, 5, 0, -1, 6, 6).collect(Collectors.toList());
        SortManage sortManage = new SortManage();
        List<Integer> sortedList = sortManage.getSortedList(list, (List<Integer> inilist) -> Sort.xuanzeSort(inilist));

        sortedList = sortManage.getSortedList(list, (List<Integer> inilist) -> Sort.maoPaoSort(inilist));

        sortedList = sortManage.getSortedList(list, (List<Integer> inilist) -> Sort.quickSort(inilist));


        System.out.println(sortedList);
    }
}
public class Sort {
    public static <T extends Comparable<? super T>> List<T> maoPaoSort(List<T> list) {
        List<T> sortedList = list;

        for (int i = sortedList.size() - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (sortedList.get(j).compareTo(sortedList.get(j + 1)) >= 0) {
                    T temp = sortedList.get(j);
                    sortedList.set(j, sortedList.get(j + 1));
                    sortedList.set(j + 1, temp);
                }
            }
        }

        return sortedList;
    }

    public static <T extends Comparable<? super T>> List<T> xuanzeSort(List<T> initlist) {
            for (int i = initlist.size() - 1; i >= 0; i--) {
                int minindex = i;
                for (int j = i; j < initlist.size() - 1; j++) {
                    if (initlist.get(j).compareTo(initlist.get(minindex)) < 0) {
                        minindex = j;
                    }
                }
                if (minindex != i) {
                    T temp = initlist.get(minindex);
                    initlist.set(minindex, initlist.get(i));
                    initlist.set(i, temp);
                }
            }

            return initlist;
    }

    public static <T extends Comparable<? super T>> List<T> quickSort(List<T> list) {
        List<T> sortedList = list;

        if (sortedList.size() <= 1) {
            return sortedList;
        }
        else {
            int l = 0;
            int h = sortedList.size() - 1;
            quickSort(sortedList, l, h);
        }

        return sortedList;
    }

    private static <T extends Comparable<? super T>> void quickSort(List<T> list, int l, int h) {

        if (l <= h) {
            return;
        }
        int m = l;

        while (list.get(l).compareTo(list.get(h)) < 0 && l < h) {
            while (list.get(h).compareTo(list.get(m)) >= 0 && h > l) {
                h--;
            }
            while (list.get(l).compareTo(list.get(m)) <= 0 && l < h) {
                l++;
            }
            swap(list, l, h);
        }
        swap(list, m, l);
        m = l;

        quickSort(list, l, m -1);
        quickSort(list, m + 1, h);
    }

    public static <T extends Comparable<? super T>> void swap(List<T> list, int l1, int l2) {
        T temp = list.get(l1);
        list.set(l1, list.get(l2));
        list.set(l2, temp);
    }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值