Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
我正参加2016CSDN博客之星的比赛 希望您能投下宝贵的一票,点击进入投票
新语法
方法引用(Method references)
我们来看个接口和一个方法
public class TestMain {
interface A{
String a(int a,int b);
}
static String hello(int a,int b){
return "";
};
}
假设我们这里要实现A接口
一般是直接内部类 或者新建一个类去实现
//我们平常的实现方法
A a = new A() {
@Override
public String a(int a, int b) {
return null;
}
};
那我们来看看用”方法引用”的方式
A a2 = TestMain::hello;
是不是很简洁?
来我们看看这种语法的规则
AAA::BBB
AAA指代某个类
BBB指代某个方法
BBB中的方法必须和你实现的接口回调的参数返回值一致
就拿我们本例中的案例可以A接口中抽象方法 String a(int a,int b);
我们可以看到这个返回值是—String 参数为—-int—-int
然后再看看我们TestMain类下的String hello(int a,int b)方法
返回值是—-String 参数是—int—int
当使用 ‘方法引用’ 时候我自动传入参数
再来看个案例
List<String> data = Arrays.asList("2","1","4");
//forEach后面会解释 大家主要看一下他的接口实现
data.forEach(new Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(t);
}
});
再看看用新语法怎么实现
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
Lambda语法
同样的看一个接口和他的实现方法
接口:
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();
});
Lambda语法在AndroidStudio中报错
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
}
Stream API
参考文献1
此Api位于
java.util.stream.Stream
是以前集合list ArraysList等升级版 更高效的操作这里只教怎么用 具体大家可以看上面的连接
集合转为stream
List<String> data = Arrays.asList("5","4","0","1");
Stream<String> stream = data.stream();- 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介绍
Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API的更多相关文章
- Effective Java 第三版——43.方法引用优于lambda表达式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Java8 新特性----函数式接口,以及和Lambda表达式的关系
这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- C#7.0新特性和语法糖详解
转自IT之家网--DotNet码农:https://www.ithome.com/html/win10/305148.htm 伴随Visual Studio 2017的发布,C#7.0开始正式走上工作 ...
- Java8新特性系列-默认方法
Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...
- 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient
[源码下载] 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient 作者:webabcd 介绍重新想象 Windows 8.1 Store ...
- Atitit. visual studio vs2003 vs2005 vs2008 VS2010 vs2012 vs2015新特性 新功能.doc
Atitit. visual studio vs2003 vs2005 vs2008 VS2010 vs2012 vs2015新特性 新功能.doc 1.1. Visual Studio2 1.2. ...
随机推荐
- hdu1003 Max Sum---最大子段和+记录开始结束点
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意: 求最大子段和,并且输出最大子段和的起始位置和终止位置. 思路: 根据最大子段和基本 ...
- break跳出循环的妙用
while True: temp = input('请输入一个整数:') try: temp = int(temp)#这里如果不是整数的话会引发报错,直接进入 except后面的reason,如果是整 ...
- Resource 的 IsSealed 问题
WFP 的 Generic.xaml ,App.xaml 等中的资源会被调用 Freezable. 在后台对该资源进行修改等操作会被提示.资源为密封对象. 如果,确定需要在后台对资源进行修改. 则需要 ...
- [项目推荐] Corcel 让你在 WordPress 中使用 Laravel
你想过可以在 WordPress 中使用 Laravel 或者任意一种 PHP 框架吗? Corcel 可以帮你实现! 开发网站应用就应该是快捷并有趣的.当然了,每个应用都会有它自己的需求和生命周期. ...
- MongoDB最佳实践中文手册
背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...
- Plupload 上传控件使用指南
本文转载至(感谢原作者分享):http://www.cnblogs.com/2050/p/3913184.html#plupload_doc2 我之前写过一篇文章<文件上传利器SWFUpload ...
- 初识webgl--我的webgl学习第一课(基于threeJs)
一,我为什么要学习webgl 一个偶然的机会,在和朋友的聊天过程中,听说了webgl,也许过去也看到过,但是没有特别在意过.原来,JavaScript也可以很好的渲染并在网页上显示三维动画,不用借助插 ...
- Scriplet的三种代码
Jsp中注释分为显示注释和隐式注释, 显示注释 -- 可以通过查看源代码看到 <!-- 第一种注释 --> 隐式注释 -- 源代码中看不到 <%--jsp注释---%> & ...
- [BZOJ 4361]isn
Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...
- ●BZOJ 3676 [Apio2014]回文串
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 题解: 后缀数组,Manacher,二分 首先有一个结论:一个串的本质不同的回文串的个 ...