java8-lamba表达式的使用-遁地龙卷风
(-1)前言
学习lamba表达式是十分重要的,你会发现java变的可爱多了。
(0)函数式接口
只有一个方法的接口称为函数式接口
JButton jButton = new JButton("123");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {}});
等同于
jButton.addActionListener(e->System.out.println("Hello world"));
jButton.addActionListener((e)->System.out.println("Hello world"));
jButton.addActionListener((ActionEvent e)->System.out.println("Hello world"));
jButton.addActionListener((ActionEvent e)->{System.out.println("Hello world");return;});
a.规则
A->B
A 部分是传入方法的参数
B 部分是函数体
参数类型以及返回类型如果可以通过上下文推断出来可不写
当参数只有一个而且它的类型可以被推导得知时,该参数列表外面的括号可以被省略
当函数体只有一个语句且返回类型可被推导时{}可省略
b.例子
Runnable runnable = ()->System.out.println(sign);
Runnable runnable2 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub}
};
通过匿名内部类我们知道run方法是不需要参数的
System.out.println(sign) 相当于run方法的方法体
Comparator<Integer> lol = (x,y)->x-y;
Comparator<Integer> lol = (x,y)->{System.out.println(x+y);return x-y;};
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return 0;
}
};
通过匿名内部类我们知道compare方法需要两个参数
这时编译通过Comparator<Integer>中Integer推导出参宿类型及返回类型
c.深入
lamba表达式可被看做函数,java.util.function定义了常用的函数式接口
http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
BiFunction<T,U,R>
T 代表第一个参数
U 代表第二个参数
R 代表返回值
这表时T,U,R都需要编译器根据上下文进行类型推导
Consumer<T> 代表e->System.out.println("Hello world")
所以当一个方法需要的是lamba表达式时,参数展现形式是java.util.function中定义的样式
(2)方法引用
方法引用是对Lamba表达式的简化
类名::方法名(对象方法、类方法)
int[] oop = {3,1,2,1};
static void sayHello(Integer name)
{
System.out.println(123);
}
Arrays.stream(oop).forEach(Test::sayHello);
Arrays.stream(oop).forEach(s->Test.sayHello(s));
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new
(3)强制类型转换
有时候编译器通过上下文推导出的返回类型与实际类型不符时需要进类型转换
Stream<Object> strings = shapelist.stream().<Object>map(s->s.getColor());
s.getColor())
s.getColor()返回的是String
(4)lamba表达式在java对象中的应用
你应该在任何java对象中尝试应用lamba表达式,通则是将这个对象转换成java.util.stream,流有串行并行之分哦!并行流关键字parallelStream
数组 Arrays.stream()
List、Set .stream()
String String.chars
...
java.util.stream提供了许多方法用来操作流中的数据,去试一试吧
http://docs.oracle.com/javase/8/docs/api/
java 8英文API,没有找到中文的...
(2)对流整体的操作
比如我们可以求一个流的的总和
int sum = Arrays.stream(oop).sum();
int sum1 = Arrays.stream(oop).reduce(0,(x,y)->x+y);
(3)集合之间的转换
我们可以将ArrayList<Shape> 转换成ArrayList<String>、Set<String>、HashMap<String,String>,HashMap<String,Shape>甚至是更复杂的
a.map()
该方法是映射的意思(一开始我联想到了HashMap),还有mapToDouble等
b.collect()
collect()接受Collectors类型的参数,用来将流重新汇合,
Collectors是收集器,Collectors.toList(),Collectors.toMap()、Collectors.groupingBy等
c.例子
public class Shape
{
private String color;
public Shape() {
// TODO Auto-generated constructor stub
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Shape(String color)
{
this.color = color;
}
}
ArrayList<String> colorList = new ArrayList<String>(){
{
add("Red");
add("Blue");
add("Yellow");
}
};
List<Shape> shapeList = colorList.stream().map(Shape::new).collect(Collectors.toList());
List<String> colos = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList());
Set<String> colosSet = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toSet());
Map<String, String> colorMap = colorList.stream().collect(Collectors.toMap(a->a,s->s));
Map<String,Shape> shapesMap = shpaeList.stream().collect(Collectors.toMap(s->s.getColor(), s->s));
Eclipse点不出getColor()方法,还以为用法不对...
Map<String,Set<Shape>> shapeMapSet = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet()));
Map<String,Map<String, List<Shape>>> shapeMap3 = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.groupingBy(s->s.getColor(),Collectors.toList())));
(4)集合本身的操纵
想要改变现有集合而不产生新的集合可以使用
Iterable.forEach(Consumer),Collection.removeAll(Predicate),List.replaceAll(UnaryOperator),List.sort(Comparator)和Map.computeIfAbsent()等
shpaeList.sort(Comparator.comparing(Shape::getColor));
(5)好文推荐
我读了两遍
http://www.cnblogs.com/figure9/archive/2014/10/24/4048421.html
http://www.cnblogs.com/GYoungBean/p/4301557.html
第三篇没有找到,那位小伙伴提供下!
java8-lamba表达式的使用-遁地龙卷风的更多相关文章
- Java8中list.sort的lamba表达式
最近写代码,需要对list集合排序,IDEA总是黄色警告: Reports calls to Collections.sort(list, comparator) which could be rep ...
- jquery toggle方法使用出错?请看这里-遁地龙卷风
这个函数在1.9之前和1.9之后的用法大不相同 1 1.9之间,用于点击元素时函数的轮流执行 toggle(function() { alert(1);//1,3,5,7... },function( ...
- 逻辑思维面试题-java后端面试-遁地龙卷风
(-1)写在前面 最近参加了一次面试,对笔试题很感兴趣,就回来百度一下.通过对这些题目的思考让我想起了建模中的关联,感觉这些题如果没接触就是从0到1,考验逻辑思维的话从1到100会更好,并且编程简易模 ...
- JQuery data方法的使用-遁地龙卷风
(-1)说明 我用的是chrome49,这个方法涉及到JQuery版本问题,我手里有3.0的,有1.9.1,后面将1.9.1及其以前的称为低版本,3.0称为高版本 测试例子用到的showMessage ...
- JQuery simpleModal插件的使用-遁地龙卷风
(0)写在前面 jquery.simpleModal.浏览器这三者的兼容性,不仅显示在报错上,还体现在所呈现的效果不是预期上. 说一下我的环境 jquery-1.8.3.js jquery.simpl ...
- Java8 Lumbda表达式 初步
Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
随机推荐
- java名词解释,让你更好理解
Java 开发工具包 (JDK) Java开发工具包是Java环境的核心组件,并提供编译.调试和运行一个Java程序所需的所有工具,可执行文件和二进制文件.JDK是一个平台特定的软件,有针对Windo ...
- Mysql和Oracle的一些语法区别
作为一个有追求的程序猿,当然要不断的学习,巴拉巴拉巴拉...好了,贴一个网址给大家,哈哈 MySQL与Oracle 差异比较:http://www.cnblogs.com/HondaHsu/p/364 ...
- pandas 按照列A分组,将同一组的列B求和,生成新的Dataframe
对于pandas中的Dataframe,如果需要按照列A进行分组,将同一组的列B求和,可以通过下述操作完成: df = df.groupby(by=['column_A'])['column_B']. ...
- HOJ 1003 Max Sum 解题报告
好几年没有做ACM了,感觉忘得差不多了,这个做着做着就打瞌睡了!言归正传,下面是我的解题思路: 首先的话,我们可以画一个函数图,以输入数组的下标为X轴,以数组的和为Y轴,当数组和小于零时,我们使用备用 ...
- PHP使用array_intersect()函数求数组交集
在PHP中求数组的交集,我们可以与PHP给我们提供的现成函数:array_intersect(),其用法格式为: array array_intersect(array array1,array ar ...
- PHP 合并数组 追加数组例子
PHP合并数组我们可以使用array_merge()函数,array_merge()函数返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次追加.其形式为: arra ...
- spark在集群上运行
1.spark在集群上运行应用的详细过程 (1)用户通过spark-submit脚本提交应用 (2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法 (3)驱动器程序与集群管 ...
- 创建 Web 前端开发环境(node和npm)
Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower, Git 和 Grunt. ...
- Intent对象详解——使用Intent启动系统组件
Android的应用程序包含三种重要组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动它们——都是依靠Intent来启动的,Intent就封装了程 ...
- Xpath语法格式整理
http://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html 经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或 ...