Sun公司在Java JDK版本1.8中加入了两个很有用的新技术—Lambda(实现了函数式编程)和Stream流操作。
01
—
Lambda表达式
在JDK1.8之前,如果我们需要创建一个匿名内部类的传统做法为:
//这里以创建一个实现Runnable线程任务匿名内部类举例new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}).start();
new Thread(()->System.out.println(Thread.currentThread().getName())).start();
由此对比可以看出极大地简化了代码。个人认为代码的可读性有所降低,但由于Stream可以说是基于Lambda的,而Stream会经常用到,所以慢慢的积累也就能快速看懂了。
那么问题来了,Lambda表达式的使用使用前提,格式,省略写法都有哪些呢?
使用前提:
Lambda 表达式只能简化只有一个抽象方法的接口的匿名内部类写法。
更简单粗暴的方式是当看到一个接口有 @FunctionalInterface 标识时就可以用。
格式:
(匿名内部类被重写的方法的型参列表) ->{别重写的方法体里面的代码}
注意:这里的“->”不能省略
省略写法:
省略写法是基于格式中给出的标准写法,当遇到以下两种情况时可以进一步省略。
参数类型可以省略不写如果只有一个参数,参数类型可以省略同时 ( ) 也可以省略。eg:
//List集合通过forEach遍历;lists.forEach((String s) -> {System.out.println(s);});//进一步简化;lists.forEach(s -> {System.out.println(s);});
2. 方法体代码只有一行,大括号可以省略,如果这一行代码是 return。return 必须省略不写,并且去掉" ; " eg:
//由于上一步骤的代码符合当前情况所以可以继续使用;简化lists.forEach(s -> System.out.println(s););
以上代码还可以再简化,但意义不大就省略不写啦~
Lambda表达式如果功能只体现在简化匿名内部类的写法那显得非常鸡肋,但Stream的出现,配合其功能就会显得极其强大。
02
—
Stream流
JDK1.8后引入了 Stream 提供了强大的元素筛选机制,大大的降低了对数组和集合中的元素操作,以下代码很好的解释说明了其优势。
//定义一个集合,遍历筛选出以数字开头的字符串并输出到控制台;List<String> list = Arrays.asList("1one", "two", "three", "4four");for(String str : list){if(Character.isDigit(str.charAt(0))){System.out.println(str);}}
通过Stream流优化改进后只需一行代码就可以进行对数组的复杂筛选。
//数组采用上一模块的数组;list.Stream().filter(str->Character.isDigit(str.charAt(0))).forEach(str -> System.out.println(str));
通过以上对比Stream流有明显的两个优点:
减少了模板代码,只用Lambda表达式指明所需操作,代码语义更加明确、便于阅读。
将外部迭代改成了Stream的内部迭代,方便了JVM本身对迭代过程做优化。
Stream流的核心思想:
就是把集合或者数组装换为 Stream 流,然后调用流方法对数据进行操作。可以理解为一条传送带,数组和集合中的元素在这条床送带传送,期间我们可以对他进行操作加工;其中需要注意流只能使用一次。就好比传送带上的元素加工后就不能再返工。
开发中流的运用思想:
集合 -> 通过Stream流辅助操作它 -> 转回成集合(收集Stream流)
流的获取:
Collection集合获取流:lists.stream()
Map集合获取流:
获取键的 Stream 流:map.keySet().stream()
获取值的 Stream 流:map.values().stream()
获取键值对像的流 :map.entrySet().stream()
3. 数组获取流有两种方式:
Arrays.stream(arrs)
Stream.of(arrs)
流的转换:
转换成List集合:s . collect(Collectors.toList());
转换成 Set 集合:s1.collect(Collectors.toSet());
转换成数组:s2.toArray()
转换成指定类型的数组:转换成指定类型的数组
常用API:
forEach,count,filter,limit,skip,map,concat。这些常用方法在API文档中就不一一展开了。
以上就是个人对Lanmbda表达式和Stream流的理解




