在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性。Lambda表达式对于Java语言就是这样的意义的存在。简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能。提供了一个简单的方式使用表达式或一系列的状态创建一个简单方法。Lambda表达式是包括一个抽象方法的接口。Lamdba表达式能够用来创建简单的匿名功能来实现对集合元素的排序和过滤,还能分配变量并传递到其它对象中。等等。以下将结合样例来加深大家对Lamdba的理解。

首先讲一下安装配置 要想使用Lamdba,须要安装jdk1.8 你能够到官网下载 至于环境变量配置  參考本人其它的博客 or baidu|google.

(鉴于本人是小菜鸟所以使用IDE而非记事本),Eclipse 版本号 为 kepler 能够搜索eclipse kepler 下载

以上两步都完毕 启动Eclipse  安装eclipse支持编译java8的插件

安装完成重新启动后 開始lamdba之旅 ^_^

先来一个简单的样例

新建项目  java8 包名 java.lamdba

废话少说 上代码

001

  1. public class HelloLambda {
  2.  
  3. public interface HelloType{
  4. void hello(String text);
  5. }
  6.  
  7. public static void main(String[] args) {
  8. HelloType helloLambda = (String text) -> {System.out.println("Hello " + text);};
  9. helloLambda.hello("Lambda");
  10. }
  11.  
  12. }

一个lamdba表达式是一个匿名的代码块封装了一个表达式或一系列状态并返回一个值。lamdba表达式也类似于其它语言中的闭包的概念。它接受零或多个參数[下面类似皆用num[+...]形式表示]。每一个參数能够显式指定类型也能够不显式指定类型[假设不指定类型java会自己主动从上下文中判断类型]。

如上所看到的,一个lamdba表达式包括了一个參数列表,一个java原来没有的字符 ‘->’ 以及一个以大括号包围起来的方法体。

  1. (argument list) -> { body }

对一个lamdba表达式,參数列表能够包括0+个參数。假设没有參数,那么仅仅使用一对空的括号。假设仅仅有1个參数,能够不必使用括号。每一个參数的类型指定都是可选的。假设没有指定类型,则从上下文中判断。body里假设有1+行,用大括号包围起来。

执行上面的程序。会看到期望的输出 。

001 定义了一个接口 接口声明了一个方法  Main里写了接口的lamdba实现  依据 ( argument list ) -> {body} ; 传递一个參数 声明或不声明类型 ( text ) 方法体里打印"Hello" + text;然后调用hello并传值 结果打印 Hello Lamdba。

上代码 002

  1. public class ActionCodeExample {
  2.  
  3. interface ActionCode{
  4. int returnCode(String codestr);
  5. }
  6.  
  7. public static void main(String[] args) {
  8. /**
  9. * A lambda expression can contain any statement that an ordinary Java
  10. * method contains. However, the continue and break keywords are illegal
  11. * at the top level.
  12. */
  13. ActionCode code = (codestr) -> {
  14. switch (codestr) {
  15. case "ACTIVE": return 0;
  16. case "INACTIVE": return 1;
  17. default:
  18. return -1;
  19. }
  20. };
  21. System.out.println(code.returnCode("ACTIVE"));
  22. }
  23.  
  24. }

002 中方法返回了一个int值,该接口方法接收一个字符串 依据switch这个字符串处理结果返回int,本例Lamdba封装了方法体的功能。

写一些自己定义的接口然后用Lamdba表达式来实现。全部的Lamdba表达式都实现了一个功能接口[仅仅有一个抽象方法的接口]。

上代码003

  1. public class ReverseTypeExample {
  2.  
  3. interface ReverseType {
  4. String reverse(String text);
  5. }
  6.  
  7. public static void main(String[] args) {
  8. ReverseType newText = (testText) -> {
  9. String tempStr = "";
  10. for (String part : testText.split(" ")) {
  11. tempStr = new StringBuilder(part).reverse().toString();
  12. }
  13. return tempStr;
  14. };
  15. System.out.println(newText.reverse("HELLO"));
  16. }
  17. }

003中功能接口包括了一个抽象方法的定义String reverse(String text),Main使用lamdba表达式实现了ReverseType,然后打印出返回值 OLLEH 。

除了使用上述方法外,我们还能使用在java.util.function包下的类去实现lamdba表达式,004将用Function<T,R>接口完毕003一样的功能。上代码004:

  1. import java.util.function.Function;
  2.  
  3. public class FunctionExample {
  4.  
  5. public static void main(String[] args) {
  6. /**
  7. * accepts a string argument and returns a string result
  8. */
  9. Function<String, String> newText = (testText) -> {
  10. String tempStr = "";
  11. for(String part : testText.split(" ")){
  12. tempStr = new StringBuilder(part).reverse().toString();
  13. }
  14. return tempStr;
  15. };
  16. System.out.println(newText.apply("WORLD"));
  17. }
  18.  
  19. }

注意到我们导入了包java.util.function.Function;格式为Function<arugent list,return result>,Function为泛型:左边为接收的參数类型,右边为返回类型。并通过 apply()  来调用。004打印出DLROW。

看了这些样例,可能会想到假设每须要一种功能,就要自己写实现。java为我们预提供了非常多功能如图所看到的

使用java.util.function包下的的功能接口能够极大的降低你要编写的代码,并提高代码的性能。

下篇文章我们将使用lamdba表达式讲一下简单的排序,本篇就到这了。

ps:本文演示样例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition

mission completed!

O(∩_∩)O~

Java8 Lamdba表达式 001的更多相关文章

  1. Java8 Lamdba表达式 002

    本篇将讲述lamdba表达式的排序,本例包括一个Player对象的集合[稍后定义],通过每一个player的分数高低对列表的player进行排序.类定义001例如以下 public class Sor ...

  2. java8中对lamdba表达式方法参数传递时,方法重载之后的类型推断

    java8中可以向方法传递一个lamdba表达式,今天看书关于类型推断碰到一个问题: 这个问题我实际操作了一下:得出结论 如果是只有一个方法的情况下,方法参数使用lamdba表达式的时候是不需要写类型 ...

  3. Java8 新特性 Lamdba表达式

    Lamdba 表达式为什么出现   Java8是自java延生以来最大的改变,他允许java中的方法和函数成为一等公民(可以在方法间传递),所以就应运而出现了Lamdba表达式,他可以将表达式传递给另 ...

  4. Java8 Lumbda表达式 初步

    Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...

  5. java8 Lambda表达式的新手上车指南(1)

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  6. Java8 Lambda表达式原理扫盲

    背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了. 正文 ...

  7. C#3.0 Lamdba表达式与表达式树

    Lamdba表达式与表达式树 Lamdba表达式 C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案. lamdba的行为 ...

  8. java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  9. C#高级编程9-第8章 委托、lamdba表达式和事件

    委托.lamdba表达式和事件 1.引用方法 函数指针是一个指向内存位置的指针,不是类型安全的.无法判断实际指向.参数和返回类型也无从知晓..NET委托是类型安全的.定义了返回类型和参数类型,不仅包含 ...

随机推荐

  1. 建房子之前先挖地基 - Java BlockingQueue理解

    最近一直在看<Think In Java>里关于并发部分的章节,读到第二十一章有一个有趣的比喻:必须先挖房子的地基,但是接下来可以并行的铺设钢结构和构建水泥部件,而这两项任务必须在混凝土浇 ...

  2. 最全的LBS手机定位技术说明

    随着手机技术的发展定位方式也发生了非常大的变化.获取手机位置有非常多种方式. 第一种:CELL-ID定位原理 通过移动网络获取设备当前所在的Cell信息来获取设备当前位置.当设备位置更新设备会向当前服 ...

  3. Windows Time服务无法启动 错误5拒绝访问

    接着上次写的文章 XP和Win7设置系统自动同步系统时间方法 本文就把故障出现的过程和解决方法一共写下来,希望大家可以看到本文在解决此项服务的思路.大家以后出现类似的问题和问题可以一样使用此类方法解决 ...

  4. css3属性——border-radius用法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <style> ...

  5. String详解说明

    大家平时都string都不是很在意,但是每当面试碰到String的时候在“==”和equals之间就乱了,下面我来说一说String,也许不够全面,请大家多多指教,希望会帮到处于蒙圈状态的人们. 一. ...

  6. 【IE】浏览器模式与文档模式 及其开发中处理方式

    原文:http://blog.csdn.net/neo_liu0000/article/details/7589731 什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和 ...

  7. rotatelogs分割apache日志文件

    rotatelogs 截断日志,进行配置.但是保存httpd.conf 之后,服务器报错: 日志文件: piped log program ' /usr/sbin/rotatelogs logs/py ...

  8. PHP使用纯真IP数据库

    #纯真数据库调用函数(需要下载纯真数据库文件) function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; ...

  9. (Problem 2)Even Fibonacci numbers

    Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting w ...

  10. 关于RtlInitUnicodeString感想

    01 VOID RtlInitUnicodeString (OUT PUNICODE_STRING DestinationString,IN PCWSTR SourceString OPTIONAL) ...