android 使用Lambda java8 Lambda

一个致命的例外引发的学习。

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值