JDK8的lambda、Stream

https://www.zhihu.com/question/20125256/answer/324121308
https://zhuanlan.zhihu.com/p/200709900
https://zhuanlan.zhihu.com/p/196557568

1、Lambda

1.1 简介

对于一个Java变量,我们可以赋给其一个“值”。
在这里插入图片描述

如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?
比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:
在这里插入图片描述
在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了。

在这里插入图片描述

当然,这个并不是一个很简洁的写法。所以,为了使这个赋值操作更加elegant, 我们可以移除一些没用的声明。
在这里插入图片描述
在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。直接这样说可能还是有点让人困扰,我们继续看看例子。我们给上面的aBlockOfCode加上一个类型:

在这里插入图片描述
这种只有一个接口函数需要被实现的接口类型,我们叫它”函数式接口“。为了避免后来的人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成"非函数接口”,我们可以在这个上面加上一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了:
在这里插入图片描述

1.2 使用

传统遍历方法:
for (String key : map.keySet()) {
    
    
    System.out.println("k=" + key + ",v=" + map.get(key));
}

使用lambda表达式遍历:
map.forEach((k, v) -> {
    
    
   System.out.println("k=" + k + ",v=" + v);
});

匿名内部类:

//使用普通的方式创建
 Runnable r1 = new Runnable() {
    
    
     @Override
	  public void run() {
    
    
	   System.out.println("普通方式创建!");
	  }
 };

 //使用拉姆达方式创建
 Runnable r2 = ()-> System.out.println("拉姆达方式创建!");

2、Stream

将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
Stream使用
在开发中,我们需要对一些数据进行过滤,如果是传统的方式,就需要对这批数据进行遍历过滤,若是使用Stream可以很方便的进行处理。

构造Stream流的方式

//构造Stream流的方式
Stream stream=Stream.of("a","b","c");
String[] strArray=new String[]{
    
    "a","b","c"};
stream=Stream.of(strArray);
stream=Arrays.stream(strArray);
List<String> list = Arrays.asList(strArray);
stream = list.stream();

Stream流之间的转换
Stream流的map使用
Stream流的filter使用
Stream流的flatMap使用
Stream流的limit使用
Stream流的sort使用
Stream流的peek使用
Stream流的parallel使用
Stream流的max/min/distinct使用
Stream流的Match使用
Stream流的reduce使用
Stream流的iterate使用

猜你喜欢

转载自blog.csdn.net/qq_37935909/article/details/108692810