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. ...
随机推荐
- Java基础语法<六> 数组 Arrays
笔记整理 来源于<Java核心技术卷 I > <Java编程思想> 允许数组长度为0 new element[0] 数组长度为0与null不同 1. 数组拷贝 允许将一 ...
- hive优化之——控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...
- Python:使用youtube-dl+ffmpeg+FQ软件下载youtube视频
声明:本文所述内容都是从http://blog.csdn.net/u011475134/article/details/71023612博文中学习而来. 背景: 一同学想通过FQ软件下载一些youtu ...
- vue.js初识(一)
一 什么是vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...
- 1025InnoDB log file 设置多大合适
转自 http://blog.csdn.net/langkeziju/article/details/51094289 数据库的东西,往往一个参数就牵涉N多知识点.所以简单的说一下.大家都知道inno ...
- 谁说深入浅出虚拟机难?现在我让他通俗易懂(JVM)
1:什么是JVM大家可以想想,JVM 是什么?JVM是用来干什么的?在这里我列出了三个概念,第一个是JVM,第二个是JDK,第三个是JRE.相信大家对这三个不会很陌生,相信你们都用过,但是,你们对这三 ...
- .NET MD5 加密
using System; using System.Security.Cryptography; using System.Text; namespace Md5Demo { /// <sum ...
- [LeetCode] Average of Levels in Binary Tree 二叉树的层平均值
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...
- mysql5.5以上 用户的操作
mysql5.5以上 用户的操作(转) 1.创建用户 create user 'username'@'host' identified by 'password'; 参数说明: username: ...
- [SCOI 2009]windy数
Description 题库链接 找出在 \([A,B]\) 间满足相邻位差值至少为 \(2\) 的正整数个数. \(1\leq A,B\leq 2\cdot 10^9\) Solution 数位 \ ...