在工作中,我做了关于Java 8项目lambda的演示,当然还有一些简单的代码来说明其中的一些要点。 Java 8的总体原因是:

  • 更简洁的代码(适用于只有一种方法和集合的类)。 “我们希望代码的读者在到达lambda表达式的“实质”之前,必须尽可能地减少语法。 – Brian Goetz(http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html)
  • 能够传递功能,而不仅仅是数据
  • 更好地支持多核处理

所有示例都可以在从此处下载的以下Java 8版本上运行:

openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-lambda-nightly-h3876-20130403-b84-b00)
OpenJDK 64-Bit Server VM (build 25.0-b21, mixed mode)

最简单的情况:

public class ThreadA {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.err.println("Hello from anonymous class");}}).start();}}
public class ThreadB {public static void main(String[] args) {new Thread(() -> {System.err.println("Hello from lambda");}).start();}}

非正式地注意语法

()|x|(x,..,z) -> expr|stmt

箭头是新的运算符。 并注意第二段代码与第一段代码相比更为简洁。

集合:

首先让我介绍一个简单的领域和一些帮助者

public class Something {private double amount;public Something(double amount) {this.amount = amount;}public double getAmount() {return amount;}public String toString() {return "Amount: " + amount;}
}public class Helper {public static List<Something> someThings() {List<Something> things = new ArrayList<>();things.add(new Something(99.9));things.add(new Something(199.9));things.add(new Something(299.9));things.add(new Something(399.9));things.add(new Something(1199.9));return things;}}public interface Doer<T> {void doSomething(T t);}

让我们对Java 7样式进行一些过滤和排序:

public class CollectionA {public static void main(String... args) {List<Something> things = Helper.someThings();System.err.println("Filter");List<Something> filtered = filter(things);System.err.println(filtered);System.err.println("Sum");double sum = sum(filtered);System.err.println(sum);}public static List<Something> filter(List<Something> things) {List<Something> filtered = new ArrayList<>();for (Something s : things) {if (s.getAmount() > 100.00) {if (s.getAmount() < 1000.00) {filtered.add(s);}}}return filtered;}public static double sum(List<Something> things) {double d = 0.0;for (Something s : things) {d += s.getAmount();}return d;}}

现在是Java 8样式– 流式传输 :

import java.util.stream.Collectors;public class CollectionB {public static void main(String... args) {List<Something> things = Helper.someThings();System.err.println("Filter lambda");List<Something> filtered = things.stream().parallel().filter( t -> t.getAmount() > 100.00 && t.getAmount() < 1000.00).collect(Collectors.toList());System.err.println(filtered);System.err.println("Sum lambda");double sum = filtered.stream().mapToDouble(t -> t.getAmount()).sum();System.err.println(sum);}}

导入java.util.function。*接口和方法参考

public class CollectionC {public static void main(String... args) {List<Something> things = Helper.someThings();System.err.println("Do something");doSomething(things, new Doer<Something>() {@Overridepublic void doSomething(Something t) {System.err.println(t);}});}public static void doSomething(List<Something> things, Doer<Something> doer) {for (Something s : things) {doer.doSomething(s);}}}

将我们的Doer界面替换为标准的Consumer界面 (以前称为Block)

import java.util.function.Consumer;public class CollectionD {public static void main(String... args) {List<Something> things = Helper.someThings();System.err.println("Do something functional interfaces");consumeSomething(things, new Consumer<Something>() {@Overridepublic void accept(Something t) {System.err.println(t);}});System.err.println("Do something functional interfaces, using lambda");consumeSomething(things, (t) -> System.err.println(t));System.err.println("Do something functional interfaces, using lambda method reference (new operator ::) ");consumeSomething(things, System.err::println);System.err.println("Do something functional interfaces, using stream");things.stream().forEach(new Consumer<Something>() {@Overridepublic void accept(Something t) {System.err.println(t);}});System.err.println("Do something functional interfaces, using stream and method reference");things.stream().forEach(System.err::println);}public static void doSomething(List<Something> things, Doer<Something> doer) {for (Something s : things) {doer.doSomething(s);}}public static void consumeSomething(List<Something> things, Consumer<Something> consumer) {for (Something s : things) {consumer.accept(s);}}}
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.stream.Collectors;public class Various {public static void main(String... args) {List<Something> things = Helper.someThings();//MapSystem.err.println(things.stream().map((Something t) -> t.getAmount()).collect(Collectors.toList()));//Reducedouble d = things.stream().reduce(new Something(0.0), (Something t, Something u) -> new Something(t.getAmount() + u.getAmount())).getAmount();System.err.println(d);//Reduce againSystem.err.println(things.stream().reduce((Something t, Something u) -> new Something(t.getAmount() + u.getAmount())).get());//Map/reduceSystem.err.println(things.stream().map((Something t) -> t.getAmount()).reduce(0.0, (x, y) -> x + y));//LazyOptional<Something> findFirst = things.stream().filter(t -> t.getAmount() > 1000).findFirst();System.err.println(findFirst.get());//Lazy no valueOptional<Something> findFirstNotThere = things.stream().filter(t -> t.getAmount() > 2000).findFirst();try {System.err.println(findFirstNotThere.get());} catch (NoSuchElementException e) {System.err.println("Optional was not null, but its value was");}//Optional one step deeperthings.stream().filter(t -> t.getAmount() > 1000).findFirst().ifPresent(t -> System.err.println("Here I am"));}}
参考: Kim Saabye Pedersen的博客博客中的JCG合作伙伴 Kim Saabye Pedersen的Java 8 lambda演练 。

翻译自: https://www.javacodegeeks.com/2013/06/java-8-lambda-walkthrough.html

Java 8 Lambda演练相关推荐

  1. java 8 lambda_Java 8 Lambda演练

    java 8 lambda 在工作中,我进行了有关Java 8项目lambda的演示,当然还提供了一些简单的代码来说明一些要点. Java 8的总体原因是: 更简洁的代码(适用于只有一种方法和集合的类 ...

  2. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  3. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  4. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  5. java lambda 应用场景,Java中Lambda的使用范围

    在之前的学习中,我们已经对Lambda表达式有所接触,并进行了相关的操作.那么在具体的使用过程上,我们需要明确其具体的使用范围.本篇将以三种访问类型为例,局部变量.成员变量和静态变量,并为大家讲解不同 ...

  6. Java 8 Lambda表达式-接口实现

    Java 8 Lambda表达式在只有一个方法的接口实现代码编写中,可以起到简化作用: (argument list) -> body 具体看Runnable接口的例子 public class ...

  7. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  8. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  9. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

最新文章

  1. 运维管理工具+chef+puppet+ansible+SaltStack
  2. 一个接口是如何在Keycloak和Spring Security之间执行的
  3. Integer 数据类型
  4. 57 - 算法 -贪心算法 - 区间不相交问题
  5. Java多线程学习总结(6)——深入理解悲观锁与乐观锁
  6. [转载]Unicode中对中文字符的编码
  7. 算法第二章实践上机实验报告
  8. 基于spring boot 轻量级的完全开源商城 mall4j
  9. 动词原形、过去式、过去分词
  10. 解决: The server encountered an internal error that prevented it from fulfilling this request.
  11. 几招紧急应对夏天雷雨天机房断电的方法!
  12. uniapp实现拍照涂鸦
  13. 大疆Tello开发教程
  14. 港美股系统开发软件开发之证券交易软件供应商对比
  15. Qt入门教程【QObject篇】属性系统
  16. 开卷有益 今天你读书了么?
  17. Matlab神经网络竞争传递函数compet
  18. 路缘石滑模机在作业中进行效率作业的底气
  19. 【CV/Matlab系列】基于matlab的视频质量仿真评价系统设计【含Matlab源码】
  20. RV1126笔记二十一:车辆颜色识别

热门文章

  1. 多个会话对表加表级读锁和表级写锁后的操作权限分析(表级读锁+表级写锁)
  2. leetcode初级算法3.存在重复元素
  3. spring boot简介_Spring Boot简介
  4. 世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界
  5. gradle项目 构建_使用Gradle构建Monorepo项目
  6. oauth2令牌刷新_了解OAuth2令牌认证
  7. java javap_javap的用途不断发展:您的Java类文件中隐藏了什么?
  8. neo4j 添加属性_Neo4j:动态添加属性/设置动态属性
  9. 并行流 线程池_使用自定义线程池处理并行数据库流
  10. redis集成spring_将Redis集成到您的Spring项目中