一:Lambda 表达式

为什么使用    :使用 Lambda 表达式可以使代码变的更加简洁紧凑。

表达了什么?: 匿名内部类的新写法;

语法 :(parameters) -> expression 或  (parameters) ->{ statements; }

  parameters 对应接口的参数例如

  expression或statements : 对应接口的实现

假设需求:一个类的方法参数是一个接口类型的,而又没有相关的该接口的实现。

接口如下

  1. public interface MyInterface {
  2. void toDo();
  3. }

1):  最不简洁的写法

  1. public class Java8Lambda {
  2. private void toDo(MyInterface myInterface) {
  3. myInterface.toDo();
  4. }
  5. public static void main(String[] args) {
  6. Java8Lambda lambda = new Java8Lambda();
  7. MyInterfaceImpl interfaceImpl = new Java8Lambda().new MyInterfaceImpl();
  8. lambda.toDo(interfaceImpl);
  9. }
  10.  
  11. class MyInterfaceImpl implements MyInterface{
  12.  
  13. @Override
  14. public void toDo() {
  15. System.out.println("我仅是打印一句话,但要写一个类出来,好麻烦!!!");
  16.  
  17. }
  18.  
  19. }
  20. }

2):java8之前的写法(匿名内部类)

  1. public static void main(String[] args) {
  2. Java8Lambda java8Lambda = new Java8Lambda();
  3. java8Lambda.toDo(new MyInterface() {
  4.  
  5. @Override
  6. public void toDo() {
  7. System.out.println("我是匿名内部类的写法,虽然简洁,但还不比lambda表达式简介");
  8. }
  9. });
  10.  
  11. // Java8Lambda lambda = new Java8Lambda();
  12. // MyInterfaceImpl interfaceImpl = new Java8Lambda().new MyInterfaceImpl();
  13. // lambda.toDo(interfaceImpl);
  14.  
  15. }

3): lambda表达式(是不是很简洁^_^)

  1. public static void main(String[] args) {
  2. Java8Lambda java8Lambda = new Java8Lambda();
  3. java8Lambda.toDo(() -> {System.out.println("我是lambda表达式写法");});
  4. }

备注:

二:Stream (流:新的api)

简洁:类似io流中的流概念(个人理解:这个流是对外部资源的读取操作如网络资源或文件),而新的流Stream主要是对内部数据建立流(主要是集合数据),并进行读取操作。主要是利用lambda表达式对集合数据进行操作,相比以前操作集合这种写法代码更简洁。

1): 通过集合生成Stream 对象

  在java8新版本中对接口(interface)特性添加了一些新的特性(这些特性有的与之前我们的认识可能不同),例如接口中的方法可以有具体实现(之前是的能的),但必须通过关键字default修饰,而且该方法不用被子类实现。

好处:这样我们可以给之前定义的接口添加新的方法,而不必修改继承他的所有子类(以前如果我们给一个接口添加新的方法,就必须给所有继承该接口的所有子类添加该方法)。可以很容易扩展之前定义接口的方法。

用例:在java8中,给Collection接口定义了一个新的实现方法 stream() ,该方法可以生产Stream 对象。

  1. List<String> list = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2. Stream<String> stream2 = list.stream();

备注:用Stream对象很大一部分用处也是为支持lambda,写出更简洁的代码而设计的,当然用stream对象对操作集合(list)有时比传统方法更高效。比如遍历集合中的数据,就比for()遍历更高效。

2) :  常用接口

*   forEach  参数(Consumer<? super String> action)

 遍历流对象并打印所有结果

*   map (Function)

用于映射集合中的每个数据

*   filter(Predicate)

 顾名思义用于过滤集合中符合条件的数据

*   limit(int )

用于获取指定数量的流

*   sorted (Comparator) 和sorted () 无参数

顾名思义对集合中的数据排序

备注:以上操作都不会影响原始集合中的数据。即他们返回一个新的集合

备注:java8,定义了一个新的接口类型叫@FunctionalInterface函数接口,即该接口中只能有一个抽象方法(可以有实现的方法)

以上集合中的参数都是函数接口(除limit方法)

三:举例

主要是想演示使用stream对象api的与lambda表达式结合使用,以及验证我前面说的Lambda 表达式是匿名内部类的新写法。(我们知道内部类通过javac编译后会生成以外部类和内部类结合的文件,其实lambda表达式也会生成响应的文件)。

  1. public static void main(String[] args) {
  2. List<String> list = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  3. Stream<String> stream = list.stream();
  4. //通过匿名内部类写法 过滤集合中的空值
  5. Stream<String> filter = stream.filter(new Predicate<String>() {
  6. public boolean test(String t) {
  7. return !t.isEmpty();
  8. }
  9. });
  10. //通过匿名内部类写法 遍历集合中的数据
  11. filter.forEach(new Consumer<String>() {
  12. public void accept(String t) {
  13. System.out.println(t);
  14. }
  15. });
  16. ////////////////////////////////////////////////////////////////////////////////////////////
  17. //lambda写法
  18. List<String> list2 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  19. Stream<String> stream2 = list2.stream();
  20. // 对比匿名内部 过滤集合
  21. Stream<String> stream3 = stream2.filter(string -> !string.isEmpty());
  22. // 对比匿名内部 遍历集合
  23. stream3.forEach( t -> System.out.println(t));
  24. }

java8新特征的更多相关文章

  1. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  2. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  3. Java8 新特性Stream 的学习和使用方法

    流(Stream) 流是java 8 中新引入的特性,用来处理集合中的数据,Stream 是一个来自数据源的元素队列并支持聚合操作. Java 中 Stream 不会存储元素. 数据源 流的来源. 可 ...

  4. java7和java8新特性

    以下来至网址: http://blog.csdn.net/samjustin1/article/details/52268004 Java7 新特性 1.switch中可以使用字符串了 String ...

  5. 2020你还不会Java8新特性?

    Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...

  6. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

  7. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  8. Java多线程-新特征-阻塞队列ArrayBlockingQueue

    阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素 ...

  9. 利用GBDT模型构造新特征具体方法

    利用GBDT模型构造新特征具体方法 数据挖掘入门与实战  公众号: datadw   实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...

随机推荐

  1. Redis数据类型SortedSET

    Sorted Set有点像Set和Hash的结合体.和Set一样,它里面的元素是唯一的,类型是String,所以它可以理解为就是一个Set.但是Set里面的元素是无序的,而Sorted Set里面的元 ...

  2. UOJ#73. 【WC2015】未来程序 提交答案题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ73.html 前言 纯属理性愉悦. 题解 Subtask1 发现就是求 $a \times b \mod c $ . 写个 ...

  3. 蓝桥杯 穿越雷区(bfs)

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

  4. 蓝桥杯 卡片换位(bfs)

    卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...

  5. Imcash:一边大裁员,一边大扩招,你能否成为区块链人才中的7%?

    农历春节后,互联网创业圈并不太平. 最早,滴滴被曝裁员,占比约为全员的15%,涉及员工约2000人.CEO程维在全员会议上称公司要做好过冬准备.此后,京东接棒,其裁员对象上升至副总裁级别高管,比例占到 ...

  6. native的详细用法

    目录 1.JNI:Java Native Interface 3.用C语言编写程序本地方法 一.编写带有 native 声明的方法的java类 二.使用 javac 命令编译所编写的java类,生成. ...

  7. C++使用 jsoncpp 解析json数据

    整合自网路 一.安装的方法 1.安装 scons 下载地址:http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.ta ...

  8. Linux查看端口号是否使用

    netstat -lntup|grep 80 如果令命无法执行 yum install net-tools

  9. 在python3中安装mysql扩展,No module named 'ConfigParser'

    在python2.7中,我们安装的是 MySqldb或这 MySQL-python,能够正却安装,但在python3中,由于 其使用的扩展  ConfigParser 已经改名为 configpars ...

  10. BZOJ2567 : 篱笆

    设第$i$个区间的左端点为$a[i]$,区间长度为$len$,要覆盖的部分的长度为$all$,因为区间左端点递增,所以最优方案中它们的位置仍然递增. 对于链的情况,要满足三个条件: 1. 区间$i$可 ...