一个致命的例外引发的学习。
E / AndroidRuntime:致命例外:主
过程:com.testwifi,PID:15340
java.lang.NoClassDefFoundError:com.testwifi.activity.MainActivity $ 1
在com.testwifi.activity.MainActivity.initView(MainActivity.java:54)
在com.testwifi.activity.MainActivity.onCreate(MainActivity.java:32)
过程:com.testwifi,PID:15340
java.lang.NoClassDefFoundError:com.testwifi.activity.MainActivity $ 1
在com.testwifi.activity.MainActivity.initView(MainActivity.java:54)
在com.testwifi.activity.MainActivity.onCreate(MainActivity.java:32)
对应的这行代码张这样
import java.util.function.Supplier;
@RequiresApi(api = Build.VERSION_CODES.N)
public void attachToRecycleView(Supplier <RecyclerView> supplier){
this.recyclerView = supplier.get();
setListener();
}
@RequiresApi(api = Build.VERSION_CODES.N)
public void attachToRecycleView(Supplier <RecyclerView> supplier){
this.recyclerView = supplier.get();
setListener();
}
当我导入这个(java.util.function.Supplier;)包的时候,给我个警告,
调用需要API Level 24(当前最小值为19),:java.util.function.Supplier。
于是乎直接加了就向上面的方法添加了@RequiresApi(api = Build.VERSION_CODES.N)
运行到5.1的小米手机,一直报上面哪个NoClassDefFoundError,查资料得知,是由于jvm编译的时候
可以找到类,运行的时候找不不到类,原来是因为我的小米5.1的,并不是7.0,对于我这个资(CAI)深(鸟)
的司机来说,明显让我头上的光环少了一圈!
不扯犊子了,来点正经的。
1.如果要使用java8中已经定义好的@FunctionalInterface的接口,minsdkVersion> = 24
2.AndroidStudio中要使用Lambda或streamAPI或其他java8新特性minsdkVersion> = 24
3.在moudle的build.gradle中android节点下添加
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
小喇叭开始广播了:滴滴答,滴滴答,滴滴啦哒
我们现在仍然叫java8新特性,(我假装没有看见java10发布)。
一:Lambda基本语法
(参数) - >表达式
或者
(参数) - > {语句;}
二:Lambda
(Apple a1,Apple a2) - > a1.getWeight()。compareTo(a2.getWeight());
Lambda参数(Apple a1,Apple a2)
- >表示调用方法
- >跟返回值或执行的代码块a1.getWeight()。compareTo(a2.getWeight())
在java8中有效的Lambda如下
无参数,有一个返回值
() - > 42
有一个字符串参数,并且有趣的返回值
(字符串s) - > s.length()
有两个int参数,无返回值,包含多行语句
(int x,int y) - > {
System.out.println(“x + y =”);
的System.out.println(X + Y);
}
LAMBDA表达式是和接口方法的签名保持一致的
机器人使用LAMBDA
//使用拉姆达之前
比较byWeight =新比较<苹果>(){
公众诠释比较(苹果A1,A2的苹果){
返回a1.getWeight()。compareTo(a2.getWeight());
}
}
//使用lambda之后
Comparator byWeight =(Apple a1,Apple a2) - > a1.getWeight()。compareTo(a2.getWeight());
//使用lambda之前
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
System.out.println(“Hellow World!”);
}
});
//使用lambda之后
线程t = new线程(() - > System.out.println(“Hellow World!”));
三:Lambda使用场景
1在函数式接口中使用Lambda
2函数式接口定义:只定义一个抽象方法的接口。例如java API中java.util.Comparator,
java.lang.Runnable,java.util.concurrent.Callable ...当然,也有类似规范这些接口通常
会有@FunctionalInterface的标准,类似于@覆盖表示方法重新一样。
3常用函数式接口:java.util.Predicate <T>,java.util.Consumer <T>,java.util.Function <T,R>
除了这些,在java.util.function包中能找到java工程师提前给我们定义好的很多函数式接口
回到正文中的那个例外,想要兼任低版本(API 25以下)的手机还是要自己写函数数式接口,自己或者新建
个包再把系统- java.util.function复制需要的接口。不要担心,宝宝已经帮你完成了,
只要下载我打好的jar包https://download.csdn.net/download/qq_35599978/10569424 ,java.util.function包名
换成了com.example.rxjavademo.function