一个通俗的说法是 :C#委托和Java中实现了 函数式编程的方法,它是函数式编程中的概念,为了更快的处理集合,在Java,c#等静态类型语言中想要引用一个函数的一种方式,(实现了通过封装匿名方法来达到强类型的链式查询。)
 
java8中的扩展方法:Java 8 允许我们使用default关键字,为接口
声明添加非抽象的方法实现。这个特性又被称为
扩展方法。
public class defaultMethod {

      public static void main(String[] args) {
Formula formula= new Formula(){
@Override
public double calculate( int a){
return sqrt( a*100);
}
}; formula.calculate(100); // 100.0
formula.sqrt(16); // 4.0 } }
interface Formula{
double calculate( int a); default double sqrt(int a){
return Math. sqrt(a);
}
}
Java8中新加的函数式接口,采用了类似于C#的委托的语法,使得一个方法定义可以直接赋值给一个“函数式接口”,所谓函数式接口就是只包含一个方法定义的接口,可以使用@FunctionalInterface加以约束。引用格式:
1、如果是静态方法,则是
ClassName::methodName。如 Object
::equals
2、如果是实例方法,则是
Instance::methodName。如Object
obj=new Object();obj::equals;
3、构造函数.则是ClassName::new
 j a v a 8 提 供 @
FunctionalInterface作为注解,这个注解是非必
须的,只要接口符合函数式接口的标准(即只包
含一个方法的接口),虚拟机会自动判断
示例:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String,Integer> converter=(from) ->Integer.valueOf(from );
Integer converted= converter.convert( "123");
System. out.println( converted);
右箭头是java编写lambda的语法糖
扩展:.NET使用ldftn指令获取方法地址,而Java则使用invokedynamic。参见:http://tech.it168.com/a2011/0609/1202/000001202458_2.shtml
 
.net 使用扩展方法对linq框架(lambda实现框架)进行构建。
而目前java 8的集合框架大量使用了接口中的默认方法来构建了Lambda查询的扩展(java官方解释为兼容性考虑) ,例如:
list接口中
默认方法的实现获取规则:
1.一个声明在类里面的方法优先于任何默认方
法(classes always win)
2.否则,则会优先选取最具体的实现
 
集合的内部迭代之中间方法与终点方法
java8  Collection接口中新添加的stream方法,可以将任何集合转化为一个Stream,然后通过内部迭代方法进行lambda化的查询。如果你面对的是一个数组,也可以用静态的Stream.of方法将它转化为一个Stream
Filter :在数据流中实现过滤功能
例如:

  public static void main(String[] arg){
List<Person> lis= new ArrayList<Person>();
lis.add( new Person(){
});
lis.add( new Person(){
});
lis.add( new Person(){
});
lis.forEach( p-> p.setAge(19));
Stream result=lis.stream().filter(p->p.getAge()>18);
}
Map:循环一组元素并返回结果列表 ,其中传入Function<T,R>来作为处理类
例如:

 public static void main(String[] arg){
List<Person> lis= new ArrayList<Person>();
Person aa= new Person();
aa.setAge(20);
lis.add( aa);
// lis.forEach(p->p.setAge(19));
//Stream<Person> result=lis.stream().filter(p->p.getAge()>18);
Stream<String> result= lis.stream().map( p-> func(p.getAge()));
// Person bb=(Person)result.toArray()[0];
Iterator<String> strIter= result.iterator();
System. out.println( strIter.next());
System. out.println( result.count());
}
private static String func( int age) {
// TODO Auto-generated method stub
return "Age:"+ age;
}
count:终点方法,计结果数。
collection:收集最终结果,返回集合结果。
例如:
List<Person> result=lis .stream().collect(Collectors.toCollection(ArrayList::new));
 
顺序流:List <Person> people = list.getStream.
collect(Collectors.toList());
 
并行流:List <Person> people = list.getStream.parallel().
collect(Collectors.toList());
顾名思义,当使用顺序方式去遍历时,每个
item读完后再读下一个item。而使用并行去遍历
时,数组会被分成多个段,其中每一个都在不同的
线程中处理,然后将结果一起输出。
 
扩展:

高阶函数

Lambda表达式除了简化匿名方法的定义以外,由于其强大的表达能力,赋于了语言更多的函数式表达能力。

将参数或者返回类型为函数的函数称为高阶函数。

如斐波那契数列函数定义:

f(0) = 1;

f(1) = 1;

f(n) = f(n-1) + f(n-2);

用C#可以写成:

Func<int, int> f = null;

f = x => x <= 1 ? 1 : f(x - 1) + f(x - 2);

 
本文参考:
 
 
 
 
 
 

java lambda小纪的更多相关文章

  1. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  2. Java lambda 表达式常用示例

    实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...

  3. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

  4. Java Lambda简明教程(一)

    Lambda表达式背景 许多热门的编程语言如今都有一个叫做lambda或者闭包的语言特性,包括比较经典的函数式编程语言Lisp,Scheme,也有稍微年轻的语言比如JavaScript,Python, ...

  5. Java Lambda表达式入门[转]

    原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...

  6. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  7. 微信机器人 返现机器人 pc版本 移动版本 java开发 小范省钱

    微信机器人 返现机器人 pc版本 移动版本 java开发 小范省钱 微信搜索微信号 fanli-x 或 扫描下方二维码,可查看效果. 非web版微信,pc/移动版微信 支持新号24小时 不封号! 有任 ...

  8. java的小程序在html中的运行测试

    java的小程序在html中的运行测试,打开vs2012,以网站模式打开,生成,调用iis临时服务器运行.

  9. 通过这些示例快速学习Java lambda语法

    对于那些不熟悉函数式编程的人来说,基本的Java lambda语法起初可能有点令人生畏.但是,一旦将lambda表达式分解为它们的组成部分,语法很快就会变得有意义并变得非常自然. Java中lambd ...

随机推荐

  1. R 网页数据爬虫1

    For collecting and analyzing data. [启示]本处所分享的内容均是笔者从一些专业书籍中学习所得,也许会有一些自己使用过程中的技巧.心得.小经验一类的,但远比不上书中所讲 ...

  2. Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则

    因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器 ...

  3. Mysql优化经验

    一.索引优化 范围匹配使用B-tree索引  等值匹配使用 HASH索引,hash所有唯一Memory引擎 2.索引三星系统, 1.相关记录放到一起 2.索引中的数据和查找中的排序顺序一直 3.索引的 ...

  4. log4net 日志框架的配置

    log4net 日志框架的配置——静态文件(一) 添加对log4net程序集的引用 选择程序集文件添加引用即可,需要注意的是需要添加相应程序版本的程序集,如果你的应用是基于.netFramework2 ...

  5. 利用jQuery的淡入淡出实现轮播器

    基本原理:将所有图片绝对定位在同一位置,透明度设为0,然后通过jQuery的淡入淡出实现图片的切换效果: 但我在使用fadeIn淡入时却无效果,最后只能使用fadeTo实现,求大神指教 HTML: & ...

  6. 2015年第12本(英文第8本):the Old Man and the Sea 老人与海

    书名:The Old Man and The Sea(老人与海) 作者:Ernest Hemingway 单词数:2.7万 不重复单词数:2600 首万词不重复单词数:1500 蓝思值:940 阅读时 ...

  7. 内存管理2(主讲MRR)

    内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...

  8. IOS 网络浅析-(六 网络图片获取之三方SDWebImage)

    网络图片获取是大多数app所能用到的,由于实际app开发中原生api很少用到,在这里就先不介绍了,以后有时间会给大家介绍.这篇文章会给大家介绍一个三方-SDWebImage.SDWebImage 是一 ...

  9. 五种创建UIImage的类方法

    五种创建UIImage的类方法 UIImage有五个类方法,用来创建UIImage的.下面介绍一下每个类方法的作用和创建实例. 1.使用类方法imageNamed:创建 + (UIImage *)im ...

  10. swift网络编程入门应用:天气预报

    学习来自<小波说雨燕 第二季 网络编程(入门篇)> 工具:xcode6.4 首先在Main.storyborad中添加并设置好三个label做简单的界面显示: import UIKit / ...