Java 8中,将会提供对lambda的支持,函数式编程FP(Functional Programming)将会得到很好地支持,而函数式编程的一个重要特点就是适合并行运算。

  

  λ:希腊字母表中排序第十一位的字母,英语名称为Lambda,读音:兰亩达。

  语法如下:

  (parameters) -> expression
  (parameters) -> statement
  (parameters) -> {statements;}

  例子如下:

  () -> Math.PI * 2.0
  (int i) -> i * 2
  (String s) -> s.length()
  (int i0, int i1) -> i0 + i1
  (int x, int y) -> { return x + y; }

  更多的特性:

  一、省略参数类型

  (int x, int y) -> { return x + y; };
  可以省略参数类型,写成(x, y) -> { return x + y; };

  不能只省略一部分类型,比如:(int x, y) -> { return x + y; };    //error

  二、1个参数可以省略括号

  (String text) -> { System.out.println(text); };
  可以写为:(text) -> { System.out.println(text); };
       也可以写为: text -> { System.out.println(text); };

  但是不能带类型,比如:String text -> { System.out.println(text); };   //error

  三、函数体多行时需要大括号

  (int i) -> {
       int prod = 1;
       for(int n = 0; n < 5; n++) prod *= i;
          return prod;
  };

  四、函数体只有一行时有些情况下可以省略大括号

  text -> System.out.println(text);

  注:assert语句不能省略带括号,比如: s -> { assert !s.isEmpty(); };

  注:return语句不能省略带括号,比如:(x, y) -> return x -y;   //error

  五、只有一行代码而且有返回值的可以省略return,会返回该行代码计算结果

  (x, y) -> { return x -y; };
  (x, y) -> x -y;

  注:return要和大括号一起省略,比如:(x, y) -> { x - y; };    //error

  

  六、用于Lambda的变量不可变

int portNumber = 1337;
Runnable r = () -> System.out.println(portNumber); // OK // 编译错误
// Local variable portNumber defined in an enclosing scope must be final or effectively final
int portNumber = 1337;
Runnable r = () -> System.out.println(portNumber); // NG
portNumber = 1338; // 通过数组实现
final int[] wrappedNumber = new int[] { 1337 };
Runnable r = () -> System.out.println(wrappedNumber[0]); // OK
wrappedNumber[0] = 1338;

  Lambda可以传递给任何希望是函数式接口的地方,比如遍历List:

  Arrays.asList("a", "b", "c").forEach(x -> System.out.println(x));

  也可以接住异常堆栈信息看看Lambda是怎么执行的:

String[] datas = new String[]{""};
Arrays.asList(datas).stream().forEach(name -> check(name)); public static int check(String s) {
if (s.equals("")) {
throw new IllegalArgumentException();
}
return s.length();
}

  

  Java 8 的类库包含一个新的包 java.util.functions ,这个包中有很多新的功能接口,这些接口可与集合类一起使用。 

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave"); 

List<String> filteredNames = names
.filter(e -> e.length() >= 4)
.into(new ArrayList<String>()); for (String name : filteredNames) {
System.out.println(name);
}

  上述的例子还可以写为:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
names
.filter(e -> e.length() >= 4)
.forEach(e -> { System.out.println(e); });

  一段代码这样写:

// 求一个List中的最大值
public static void main(String[] args) {
List<Integer> k = new ArrayList<Integer>();
k.add(1);
k.add(2);
k.add(3);
k.add(8);
k.add(11);
k.add(20);
k.add(50);
int max = Integer.MIN_VALUE;
for (int j : k) {
if (max < j) {
max = j;
}
}
System.out.println(max);
}

  

  假如这段代码中查找最大值成了性能瓶颈,那么需要将这段代码改为并发操作。想想就不容易。那现在使用lamda表达式这样写:

// 求一个链表中的最大值
public static void main(String[] args) { List<Integer> k = new ArrayList<Integer>();
k.add(1);
k.add(2);
k.add(3);
k.add(8);
k.add(11);
k.add(20);
k.add(50);
Optional<Integer> max = k.stream().max((a,b) -> {return a-b;});
System.out.println(max);
}

  想变成并发操作这样写:

// 求一个链表中的最大值
public static void main(String[] args) { List<Integer> k = new ArrayList<Integer>();
k.add(1);
k.add(2);
k.add(3);
k.add(8);
k.add(11);
k.add(20);
k.add(50);
Optional<Integer> max = k.parallelStream().max((a,b) -> {return a-b;});
System.out.println(max);
}

  很简单吧。就是将k.stream() 改成 k.parallelStream()

  详细的可以参考:http://blog.csdn.net/cctt_1/article/details/24835803

  

Java8之Lambda表达式基础的更多相关文章

  1. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...

  2. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  3. java8的lambda表达式

    关于java8的lambda表达式 lambda表达式一般用于接口,因为lambda表达式是函数式编程. 1.有且仅有一个抽象方法被称为函数式接口,函数式接口可以显示的被@FunctionalInte ...

  4. 【Java8新特性】Lambda表达式基础语法,都在这儿了!!

    写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...

  5. 十分钟学会Java8的lambda表达式和Stream API

    01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...

  6. 十分钟学会Java8:lambda表达式和Stream API

    Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行 ...

  7. Java8的lambda表达式和Stream API

    一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏味,非过来 ...

  8. Java8的Lambda表达式,你会不?

    目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...

  9. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

随机推荐

  1. [国嵌攻略][066][ARP协议实现]

    以太网通讯 在计算机网络中,数据发送的过程就是把数据按照各层协议层层封装的过程.在这个过程中,最终要使用的协议通常是以太网协议(数据链路层协议). 以太网包格式 目的MAC地址:接收者的物理地址(6字 ...

  2. TypeScript笔记 4--变量声明

    在上一篇:基础变量中我们在声明变量时使用了关键字let,这和JS中的var有点类似. 语法 基本语法:let 变量名:类型.当然类型不是必须的. let x:number; let y:string ...

  3. javascript数据类型之Array类型

    Array类型 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.而且,ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.虽然ECMAScript数组与 ...

  4. LED服务总结

    简单的程序总结 一个简单的用于控制LED屏幕的小程序,用到的一个常识 LED服务开发总结 系统运行截图   系统功能说明: 1.ServerStrack服务,提供前台访问. 2.动态库调用,用于信息转 ...

  5. Linux 查找命令汇总

    linux下查找命令挺多,本文以列表方式说明which.whereis.locate.find命令的区别: 命令 概述 语法 示例 适用OS 搜索结果 which 在PATH变量指定的路径中,搜索某个 ...

  6. 自己写的一个tomcat发布脚本

    闲来无事,就自己写一个shell脚本,方便自己以后在服务器上部署tomcat下的项目.我本地用maven打包,然后每次都要人工去切换一堆堆目录,有点繁琐,所以我写了下面的shell脚本. #! /bi ...

  7. linux相关概念

    最近这段时间玩Linux比较多,前面我也转载了好多的相关的Linux指令.这里自己关于Linux概念来自己整理一下. 首先我们应该知道Linux到底是什么? 我们知道Linux这玩意儿是在计算机上面运 ...

  8. tomcat安装自制作ssl证书

    1.执行命令 C:\servers\apache-tomcat-8.0.27>keytool -genkey -alias tomcat -keyalg RSA -keypass pass123 ...

  9. android新建项目

    MinMum Required SDK :最低支持的Android api的版本,你的应用不能在低于这个版本的手机上面运行 Target SDK:你的应用最高支持android api版本 Compi ...

  10. 了解ViewFlipper工作机制

    平时我们在使用ViewFlipper的时候一方面感叹ViewFlipper的使用很简单,另一方面,我们时常感叹ViewFlipper给我们的接口方法太少,很多常用的效果都不好做,很难施展拳脚,这篇文章 ...