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. 2017ecjtu-summer training #1 UVA 12050

    A palindrome is a word, number, or phrase that reads the same forwards as backwards. For example, th ...

  2. An Easy Problem?!(细节题,要把所有情况考虑到)

    http://poj.org/problem?id=2826 An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  3. UE4 UnLoadStreamLevel

    今天测试发现一个bug记录一下,如果把某一个子关卡的加载方式设置为Always Loaded时,调用UnloadStreamLevel时不会执行Completed后面的节点,也就是一直没有完成.

  4. git常用命令--转载

    http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

  5. 从零开始学习前端开发 — 15、CSS3过渡、动画

    一.css3过渡 语法: transition: 过渡属性 过渡时间 延迟时间 过渡方式; 1.过渡属性(transition-property) 取值:all 所有发生变化的css属性都添加过渡 e ...

  6. k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

  7. 如何完成域名和ip地址的绑定

    首先,我们要知道什么是域名绑定,所谓域名绑定就是是指已选定的域名与服务器主机的空间绑定,实在是在域名注册查询上设置或者WEB服务器上设置,使一个域名被指导向一特定空间,从而使访问者访问你的域名的时候就 ...

  8. destoon框架二次开发【整理】

    =========================================================== destoon使用中的一些心得   ====================== ...

  9. Mysql执行计划说明

    Mysql执行计划翻译: 官网原文请见http://dev.mysql.com/doc/refman/5.6/en/explain-output.html:5.6 EXPLAIN语句提供有关SELEC ...

  10. Log4j扩展使用--日志格式化器Layout

    Layout:格式化输出日志信息 OK,前面我已经知道了.Appender必须使用一个与之相关联的Layout,这样才能知道怎样格式化输出日志信息. 日志格式化器Layout负责格式化日志信息,方法l ...