基础之Lambda和Stream的邂逅

show me the code and take to me,做的出来更要说的明白
GitHub项目JavaHouse同步收录
喜欢就点个赞呗! 你的支持是我分享的动力!

引入

是否有遇到看不懂身边同事代码的情况,是否有被面试官问到 Java 新特性不懂的情况。我掐指一算你大概是遇到的了 Lambda 表达式 和 Stream 流。为了解决上述情况,我特地献上一份关于 Lambda 和 Stream 的指南,以解燃煤之急。

Lambda

普通调用

首先我们先看第一个例子。

@Testpublic void test(){        test1(1);    }private void test1(int a){    System.out.println(a);}复制代码

运行Test,输出结果

1复制代码

相信这里大家都很清楚,我不需要多废话!

内部类调用

那我们在来看看第二个例子

public interface IPerson {    void personMethod();}private void test2(IPerson person){        person.personMethod();    }@Testpublic void test2(){    test2(new IPerson(){        @Override        public void personMethod() {            System.out.println(1);        }    });}复制代码

运行Test,输出结果

1复制代码

这里的话我将参变成了一个接口,使用了内部类。大家是不是觉得这种形式的代码不容易看清楚,一个参数竟然放了这么多东西,真是让人头大啊。所以我们有了 Lambda 表达式。

Lambda 重构

我们使用 Lambda 表达式重写上面代码。得到下面新代码:

public interface IPerson {    void personMethod();}private void test2(IPerson person){        person.personMethod();    }@Testpublic void test2(){    test2(() -> System.out.println(1));}复制代码

运行Test,输出结果

1复制代码

这样的代码是不是比使用内部类代码优雅了很多,看起来舒服极了,关键代码也少了。这就是 Lambda 表达式的魅力。

Lambda 调用

好了,经过上面的层层递进的例子,我们引出了 Lambda 表达式。现在我们开始了解 Lambda 表达式的语法。

语法:

-> 复制代码

是的,他的调用语法就是一个箭头。当然这样说的话我也不太信。其实还没说完。

当我们的方法没有参数的时候,没有返回,他需要保留括号,形式如下:

() -> System.out.println(1);复制代码

当有一个参数的时候,没有返回,小括号可以去掉,形式如下

a -> System.out.println(a)复制代码

当有多个参数的时候以及方法里面的语法多余一行的时候,没有返回,,形式如下:

(a, b) -> {            System.out.println(a);            System.out.println(b);        }复制代码

上面例子都是没有返回的,那么有返回又是怎样的呢?形式如下:

a -> {            System.out.println(a);            return a;        }复制代码

是的,那就加一下返回啊。

函数式接口

其实上面都是展示如果去调用,不知道你们是否发现后者感觉到,他没有方法名就去调用了,是不是接受不了。这是正常情况。因为我们调用的接口里面这有一个方法,所以我们只需要一个 ->就可以调用到接口里面方法。

所以我们如果想自己写一个 Lambda 的话。只需要在接口里面写一个抽象方法即可。举了例子:

public interface IPerson {    int personMethod(int a);}复制代码

当然我建议加一个注解@FunctionalInterface,形式如下:

@FunctionalInterfacepublic interface IPerson {    int personMethod(int a);}复制代码

这样就是限制接口里面只能有一个抽象方法了。这个就叫函数式接口。当我们再继续往里面加的话,就会报错了:

其实大多数情况下,我们不需要自己写函数式接口。因为 Java 已经内置了四种常见的函数式接口。

这四个接口需要一般与 Stream 一起使用。

Stream

普通迭代

我们直接看代码,一个普通的迭代例子

public class StreamTest {     @Test    public void test2(){        List list = Arrays.asList(1, 2, 3, 4, 5);        int count = 0;        for (Object o : list){            count ++;        }        System.out.println(count);    }}复制代码

运行Test,输出结果

5复制代码

在 Java8 之前,我们统计 list 的大小是上面的形式。

Stream 重构

现在我们用 Stream 重构上面的代码

public class StreamTest {    @Test    public void test3(){        List list = Arrays.asList(1, 2, 3, 4, 5);        long count = list.stream().count();        System.out.println(count);    }}复制代码

运行Test,输出结果

5复制代码

瞬间感觉代码清爽了很多,变得优雅了,关键代码也少了。这就是 Stream 的魅力。

经过上面的例子,我们可以感觉到 Stream 可以代替 for 循环,进行特定操作。注意这里是特定的操作,因为 Stream 接口里面只有只封了几个方法。

collect()

collect() 方法可以将 Stream 变成 List等集合形式。

我们看一个例子:

public class StreamTest {    @Test    public void test4(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.collect(Collectors.toList());        }}复制代码

fiter()

fiter() 方法与 Predicate 函数接口一起使用。

不想看文字,还有图片

该方法可以过滤出特定元素并且返回原来的类型。举一个例子

public class StreamTest {    @Test    public void test5(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.filter(a -> a > 3).collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[4, 5]]复制代码

map()

map() 方法与 Function 函数接口一起使用。

不想看文字,还有图片

该方法可以将原来的集合进行修改,包括返回类型,然后返回一个新的集合。举一个例子

public class StreamTest {   @Test    public void test8(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.map(a -> a = 1).collect(Collectors.toList());//        List collect = stream.map(a -> a == 1).collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[1, 1, 1, 1, 1, 1]]复制代码

我们可以看到两种情况 Integer -> Integer 以及 Integer -> Boolean

注意我们不能操作同一个 stream 两次,不然会报错,有兴趣可以试试。

distinct()

该方法意如其字,就是去重。代码如下

public class StreamTest {    @Test    public void test7(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.distinct().collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[1, 2, 3, 4, 5]]

多stream_基础之Lambda和Stream的邂逅相关推荐

  1. JAVA基础知识|lambda与stream

    lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...

  2. Java基础 之 lambda、stream概念及实际使用举例

    lambda 什么是lambda 函数式编程,将代码块作为参数传入方法,用更简洁的方法创建一个函数式接口的实例. 什么是函数式接口 一个有且只含有一个抽象方法的接口(可以有多个默认方法). 举个栗子: ...

  3. Java基础学习Lambda与Stream(续)

    /*     中间操作 : 映射 -> 将stream操作的每个元素转换成另外一个种形式|提取信息         <R> Stream<R> map(Function& ...

  4. java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作

    写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...

  5. java基础之lambda表达式

    java基础之lambda表达式 1 什么是lambda表达式 lambda表达式是一个匿名函数,允许将一个函数作为另外一个函数的参数,将函数作为参数传递(可理解为一段传递的代码). 2 为什么要用l ...

  6. lambda表达式——Stream管道流的map操作

    lambda表达式--Stream管道流的map操作 一.回顾Stream管道流map的基础用法 二.处理非字符串类型集合元素 三.再复杂一点:处理对象数据格式转换 四.flatMap 一.回顾Str ...

  7. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  8. 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解

    前言 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScr ...

  9. 万字详解,JDK1.8的Lambda、Stream和日期的使用详解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...

最新文章

  1. python随机补边缘border
  2. Revising the Select Query I(单表查询)
  3. WindowsPE 第五章 导出表编程-1(枚举导出表)
  4. 微信小程序 获取用户信息 官网例程 详解
  5. 完美解决tomcat/springboot启动速度相当慢 快死的状态了
  6. python调用c代码
  7. python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法
  8. SSM整合——实现图书的查询功能
  9. 80. Session
  10. 端到端车道线检测_弱监督对象检测-端到端培训管道
  11. PADS2007_教程之PADS LAYOUT
  12. wps里面函数怎么使用_wps表格函数及函数简单使用
  13. GLES3.0中文API-glMemoryBarrier
  14. note GAN model
  15. 2019中国信息安全自主可控行业政策盘点及网络安全行业分析
  16. Qt QLineEdit单行输入框用法详解
  17. 4G模块(BC76)
  18. bilibili账号申诉中心_B站的申诉渠道究竟在哪啊
  19. 数据库技术:关系型数据库设计总结
  20. 云集微店怎么做 我的第一份生意经

热门文章

  1. Unity(一)Unity脚本程序开发
  2. 小甲鱼 OllyDbg 教程系列 (十) : Windows 逆向常用 api 以及 XOFTSPY 逆向
  3. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
  4. 自动分页,返回时跳回指定页
  5. 10停止nginx命令 win_Linux下配置Nginx并使用https协议
  6. mysql load data infile 导入数据 某一列 空_Sql数据挑战赛amp;网络销售案例分析
  7. 【读书笔记】--- 《码出高效:java开发手册》
  8. HashMap源码解释
  9. java 3位小数_数字有效小数第三位四舍五入
  10. java php html,java和html的区别是什么