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. ...
随机推荐
- POJ-2632 Crashing Robots模拟
题目链接: https://vjudge.net/problem/POJ-2632 题目大意: 在一个a×b的仓库里有n个机器人,编号为1到n.现在给出每一个机器人的坐标和它所面朝的方向,以及m条指令 ...
- 【面试题】由HashMap引发的一系列追问
HashMap和HashTable的区别 同:HashMap和Hashtable都实现了Map接口. 异:HashMap允许null的键值对,非同步的,非线程安全的,效率高: HashTable不允许 ...
- [Nginx]-外部多端口映射Https443端口配置
https服务器配置完成后,域名访问默认匹配至443端口,如果想同时通过https域名网址来请求多个对外服务,就需要在Nginx配置里来对请求进行规则判断,并匹配至相应的内部端口,这也是Nginx反向 ...
- css3 box-shadow阴影(外阴影与外发光)
基础说明: 外阴影:box-shadow: X轴 Y轴 Rpx color; 属性说明(顺序依次对应): 阴影的X轴(可以使用负值) 阴影的Y轴(可以使用负值) 阴影 ...
- Unity依赖注入
一.简介 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的 ...
- [LeetCode] Find Duplicate File in System 在系统中寻找重复文件
Given a list of directory info including directory path, and all the files with contents in this dir ...
- 【Swift】swift定义全局变量
swift定义全局变量非常简单哈,只要在类class上面直接定义,就是全局变量了 当需要在类里面定义一个类函数访问的变量的时候,直接在var或者let 前面加一个 static
- python 随笔
python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 ...
- Mysql运算符与函数(胖胖老师)
use test;create table `employee`( emp_no int unsigned, emp_name varchar(30), emp_sex varcha ...
- MySQL的安全机制
MySQL的安全机制: 1.MySQL登录 mysql -u账户 -p密码 -h127.0.0.1 -P端口 数据库名 mysql -h hostname|hostIP -p port -u user ...