java8新特性
在前面已经见过一些东西了,但是:挖得有坑儿,主要是为了养成独立思考的习惯
因为:灌入式学习并不好
1、lambda表达式
package cn.xieGongZi.reviewInnerClass;
import java.util.TreeSet;
// 回顾一下以前玩匿名内部类
public class Demo {
public static void main(String[] args) {
// 以前在treeSet中研究过它的底层排序原理,所以再来玩儿一下
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(20);
treeSet.add(30);
treeSet.add(1);
treeSet.add(9);
treeSet.add(10);
treeSet.add(18);
System.out.println( treeSet ); // 这是升序排列,那我想降序排列呢?
}
}
来嘛:改变排序规则
package cn.xieGongZi.reviewInnerClass;
import java.util.Comparator;
import java.util.TreeSet;
// 回顾一下以前玩的匿名内部类
public class Demo {
public static void main(String[] args) {
// 来吧:改变排序规则 ———— 重写comparator接口( 匿名内部类 )
TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 改变比较规则
}
});
treeSet.add(20);
treeSet.add(30);
treeSet.add(1);
treeSet.add(9);
treeSet.add(10);
treeSet.add(18);
System.out.println(treeSet);
}
}
这样虽然是把排序规则改变了,但是不麻烦吗?
package cn.xieGongZi.reviewInnerClass;
import java.util.TreeSet;
public class UseLambda {
public static void main(String[] args) {
// 来吧:改变排序规则 ———— 使用lambda表达式
TreeSet<Integer> treeSet = new TreeSet<>( (o1,o2 )-> { // 1、为什么这里写两个o1,o2的参数,然后加个{},这个表达式就可以去执行相应的东西
// 即:这个表达式怎么知道 老衲重写的是Comparator接口?
// 2、另外一个问题:看起来这个o1,o2貌似没有值吧
// 它不是参数吗,在这里看起没赋值啊,所以最后怎么可以得出结果?
return o2 - o1; // 改变比较规则————即:业务代码
} );
treeSet.add(20);
treeSet.add(30);
treeSet.add(1);
treeSet.add(9);
treeSet.add(10);
treeSet.add(18);
System.out.println(treeSet);
}
}
package cn.xieGongZi.functionInterface;
public class Test {
public static void main(String[] args) {
// 开始玩儿
test test = new test();
test.doAdd( new TestFunctionInterface() { // 这中间的这一坨就是一个对象嘛 ———— 一个TestFunctionInterface对象
// 这里面是用了这个对象 去 调用了TestFunctionInterface中的add()方法
// 所以结果来了:lambda表达式中有一个对象名,这个对象名就是这里的TestFunctionInterface的对象
// 参数有没有值:有,为什么?
// 就是调用doAdd()方法的时候不得传个参数吗,这里说的参数是TestFunctionInterface这个对象携带进去的
// 携带进去之后去了哪里? ———— 把这个值赋给了重写的add()方法里面需要的参数了嘛
// 因此:总结一句话就是lambda表达式就是指:把一段代码( 这段代码里面做了一些事情,如:这里的输出语句 )传递给了某一个函数,从而让这个函数去执行相关的操作
// 要真正理解lambda表达式,关键就是这里的回调,就这里会绕一下
@Override
public void add() {
// 正常是这么玩儿的————重写这个方法
System.out.println("老衲自东土大唐而来.....");
}
}); // 这里面doAdd()中是不是需要传一个TestFunctionInterface类型的参数( 这个参数指向的那个类型,就是他喵说的函数式接口 )
// 在java中是不是函数式接口,会有一个注解来进行说明@FunctionalInterface ———— 这个东西就是一个声明性的东西而已
}
}
// 定义一个接口
interface TestFunctionInterface{
// 这里面只有这一个方法是真正属于这个接口的
void add();
}
class test{
public void doAdd( TestFunctionInterface t ){
t.add(); // 这里用TestFunctionInterface类型的对象 回调 TestFunctionInterface中的抽象方法
}
}
原文:https://www.cnblogs.com/xiegongzi/p/15161243.html