我正参加2016CSDN博客之星的比赛 但愿您能投下宝贵的一票,点击进入投票html
咱们来看个接口和一个方法java
public class TestMain {
interface A{
String a(int a,int b);
}
static String hello(int a,int b){
return "";
};
}
假设咱们这里要实现A接口
通常是直接内部类 或者新建一个类去实现android
//咱们日常的实现方法
A a = new A() {
@Override
public String a(int a, int b) {
return null;
}
};
那咱们来看看用”方法引用”的方式api
A a2 = TestMain::hello;
是否是很简洁?bash
来咱们看看这种语法的规则
AAA::BBB
AAA指代某个类
BBB指代某个方法
BBB中的方法必须和你实现的接口回调的参数返回值一致markdown
就拿咱们本例中的案例能够A接口中抽象方法 String a(int a,int b);
咱们能够看到这个返回值是—String 参数为—-int—-intapp
而后再看看咱们TestMain类下的String hello(int a,int b)方法
返回值是—-String 参数是—int—int
当使用 ‘方法引用’ 时候我自动传入参数ide
再来看个案例gradle
List<String> data = Arrays.asList("2","1","4");
//forEach后面会解释 你们主要看一下他的接口实现
data.forEach(new Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(t);
}
});
再看看用新语法怎么实现ui
List<String> data = Arrays.asList("2","1","4");
//forEach后面会解释 你们主要看一下他的接口实现
data.forEach(System.out::printf);
上面两个效果是同样的 都是输出 2 1 4
System.out 是 java.lang.System.out中的一个类
printf 是System.out中的一个方法
咱们来看下这个printf方法
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
能够看到传入值一个字符串 返回值为void
咱们再来看下forEach中的匿名内部类
data.forEach(new Consumer<String>() { @Override public void accept(String t) { }
});
传入的是一个String 返回的是void 因此正好可使用System.out.println
一样的看一个接口和他的实现方法
接口:
public class TestMain {
interface A{
String a(int a,int b);
}
}
来看看吧咱们实现的方法
//咱们日常的实现方法
A a = new A() {
@Override
public String a(int a, int b) {
return null;
}
};
Lambda语法实现
//直接返回字一个字符串
A a2 = (aa,b)->{return "";};
//计算aa+b的数值 而后转化为字符串返回
A a3 = (int aa,int b)->{String s=(aa+b)+"";return s;};
//至关于直接返回
A a4 = (int aa,int b)-> "我不想计算aa+b的值";
//若是A接口中a方法没有参数也没有返回值假如抽象方法为void a();
A a2 = ()->{};
Lambda语法
1. (aa,bb)->”“;
aa 抽象方法的第一个参数 自动会按顺序赋值
bb抽象方法的第二个参数 自动会按顺序赋值
“” 抽象方法的返回值 至关于 return “”
2. (int aa,float bb)->””
aa 抽象方法的第一个参数而且类型为int 自动会按顺序赋值
bb抽象方法的第二个参数而且类型为float自动会按顺序赋值
“” 抽象方法的返回值 至关于 return “”
这里的类型能够根据你的抽象方法肯定
3. (aa,bb)->{
System.out.println(“嘿嘿传入的数值a = “+aa);
return “”;
}
aa 抽象方法的第一个参数 自动会按顺序赋值
bb抽象方法的第二个参数 自动会按顺序赋值
{} 方法体能够在里面执行语句最后再返回
4. (int aa,int bb)->{
System.out.println(“嘿嘿传入的数值a = “+aa);
return “”;
}
和”3”同样 只不过指定了参数
5. ()->{ }
抽象接口没有参数返回值为void
案例1:
原版:
FileFilter java = new FileFilter() {
@Override
public boolean accept(File pathname) {
return false;
}
};
lambda
FileFilter java2 = (file)-> true;
在android中的一个案例:
ImageView iv =(ImageView)findViewById(R.id.iv);
iv.setOnClickListener(view -> {
Toast.makeText(this,"你的内容",Toast.LENGTH_SHORT).show();
Toast.makeText(this,"你的内容",Toast.LENGTH_SHORT).show();
});
1.首先先项目根目录下的build.gradle中加入(注意加黑字)as2.0之后版本用3.4
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
2.而后再module目录下的build.gradle中使用插件(放在第一行就行),加入
apply plugin: 'me.tatarka.retrolambda'
3.jmodule目录下的build.gradle中android语段中加入
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
参考文献1
此Api位于
java.util.stream.Stream
是之前集合list ArraysList等升级版 更高效的操做这里只教怎么用 具体你们能够看上面的链接
集合转为stream
List<String> data = Arrays.asList("5","4","0","1");
Stream<String> stream = data.stream();
List<String> data = Arrays.asList("5","4","0","1");
Stream<String> stream = data.stream();
List<Object> asList = Arrays.asList(stream.toArray());
List<String> data = Arrays.asList("5","4","0","1");
Stream<String> stream = data.stream();
stream.collect(Collectors.toList());
关于collect 能够看下这篇文章
collect介绍