暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JDK1.8之后的新技术—Lambda与Strea流

一十二章经 2019-07-08
239

Sun公司在Java JDK版本1.8中加入了两个很有用的新技术—Lambda(实现了函数式编程)和Stream流操作。


01


Lambda表达式


在JDK1.8之前,如果我们需要创建一个匿名内部类的传统做法为:

//这里以创建一个实现Runnable线程任务匿名内部类举例
new Thread(new Runnable() {
@Override
     public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();

1.8之后,通过Lambda表达式以上代码改进为:

new Thread(()-> 
System.out.println(Thread.currentThread().getName())).start();

由此对比可以看出极大地简化了代码。个人认为代码的可读性有所降低,但由于Stream可以说是基于Lambda的,而Stream会经常用到,所以慢慢的积累也就能快速看懂了。

那么问题来了,Lambda表达式的使用使用前提,格式,省略写法都有哪些呢?


使用前提

  • Lambda 表达式只能简化只有一个抽象方法的接口的匿名内部类写法。

  • 更简单粗暴的方式是当看到一个接口有 @FunctionalInterface 标识时就可以用。


格式:

(匿名内部类被重写的方法的型参列表) ->{
别重写的方法体里面的代码
}

注意:这里的“->”不能省略


省略写法:

省略写法是基于格式中给出的标准写法,当遇到以下两种情况时可以进一步省略。

  1. 参数类型可以省略不写如果只有一个参数,参数类型可以省略同时 ( ) 也可以省略。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流有明显的两个优点:

  1. 减少了模板代码,只用Lambda表达式指明所需操作,代码语义更加明确、便于阅读。

  2. 将外部迭代改成了Stream的内部迭代,方便了JVM本身对迭代过程做优化。


Stream流的核心思想:

就是把集合或者数组装换为 Stream 流,然后调用流方法对数据进行操作。可以理解为一条传送带,数组和集合中的元素在这条床送带传送,期间我们可以对他进行操作加工;其中需要注意流只能使用一次就好比传送带上的元素加工后就不能再返工


开发中流的运用思想:

集合 -> 通过Stream流辅助操作它 -> 转回成集合(收集Stream流)


流的获取:

  1. Collection集合获取流:lists.stream()

  2. Map集合获取流:

    • 获取键的 Stream 流:map.keySet().stream()

    • 获取值的 Stream 流:map.values().stream()

    • 获取键值对像的流 :map.entrySet().stream()

3.   数组获取流有两种方式:

  1. Arrays.stream(arrs)

  2. Stream.of(arrs)

流的转换:

  1. 转换成List集合:s . collect(Collectors.toList());

  2. 转换成 Set 集合:s1.collect(Collectors.toSet());

  3. 转换成数组:s2.toArray()

  4. 转换成指定类型的数组:转换成指定类型的数组


常用API:

forEach,count,filter,limit,skip,map,concat。这些常用方法在API文档中就不一一展开了。


以上就是个人对Lanmbda表达式和Stream流的理解


文章转载自一十二章经,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论