java8 Lambda表达式

java8 Lambda表达式java8 Lambda表达式

大家好,又见面了,我是你们的朋友全栈君。

1.替代匿名内部类

毫无疑问,lambda表达式用得最多的场合就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类!请看代码:

如果使用匿名内部类:

    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }

而如果使用lambda表达式:

    @Test
    public void runable() {
        new Thread(() -> System.out.println("It's a lambda function!")).start();
    }

最后的输出:

The old runable now is using!
It's a lambda function!

是不是强大到可怕?是不是简单到可怕?是不是清晰明了重点突出到可怕?这就是lambda表达式的可怕之处,用极少的代码完成了之前一个类做的事情!

2.使用lambda表达式对集合进行迭代

Java的集合类是日常开发中经常用到的,甚至说没有哪个java代码中没有使用到集合类。。。而对集合类最常见的操作就是进行迭代遍历了。请看对比:

    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList("java","scala","python");
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
      
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }

如果熟悉scala的同学,肯定对forEach不陌生。它可以迭代集合中所有的对象,并且将lambda表达式带入其中。

languages.forEach(System.out::println);

这一行看起来有点像c++里面作用域解析的写法,在这里也是可以的。

3.用lambda表达式实现map

一提到函数式编程,一提到lambda表达式,怎么能不提map。。。没错,java8肯定也是支持的。请看示例代码:

    @Test
    public void mapTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }

最后的输出结果:

10.5
21.0
31.5

map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。

4.用lambda表达式实现map与reduce

既然提到了map,又怎能不提到reduce。reduce与map一样,也是函数式编程里最重要的几个方法之一。。。map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个,请看:

    @Test
    public void mapReduceTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }

最终的结果为:

63.0

如果我们用for循环来做这件事情:

    @Test
    public void sumTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }

相信用map+reduce+lambda表达式的写法高出不止一个level。

5.filter操作

filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。

    @Test
    public void filterTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }

最后的结果:

30.0
40.0

将java写出了python或者scala的感觉有没有!是不是帅到爆!

6.与函数式接口Predicate配合

除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。Predicate接口非常适用于做过滤。

    public static void filterTest(List<String> languages, Predicate<String> condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
    }

    public static void main(String[] args) {
        List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");
        System.out.println("Language starts with J: ");
        filterTest(languages,x -> x.startsWith("J"));
        System.out.println("\nLanguage ends with a: ");
        filterTest(languages,x -> x.endsWith("a"));
        System.out.println("\nAll languages: ");
        filterTest(languages,x -> true);
        System.out.println("\nNo languages: ");
        filterTest(languages,x -> false);
        System.out.println("\nLanguage length bigger three: ");
        filterTest(languages,x -> x.length() > 4);
    }

最后的输出结果:

Language starts with J: 
Java 

Language ends with a: 
Java 
scala 

All languages: 
Java 
Python 
scala 
Shell 
R 

No languages: 

Language length bigger three: 
Python 
scala 
Shell 

可以看到,Stream API的过滤方法也接受一个Predicate,这意味着可以将我们定制的 filter() 方法替换成写在里面的内联代码,这也是lambda表达式的魔力!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106427.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ASP.NET MVC实现权限管理以及权限分配「建议收藏」

    ASP.NET MVC实现权限管理以及权限分配「建议收藏」权限管理与分配至少要有三张表然而往往难住我们的并不是数据库的设计而是后台的实现 //查询用户所具有的权限    publicListGetprenisson(intuserid){      ptestEntitiespst=newptestEntities();          stringsql

    2022年7月22日
    15
  • [日常训练]AekdyCoin的跳棋「建议收藏」

    [日常训练]AekdyCoin的跳棋「建议收藏」AekdyCoin正在玩一个游戏,该游戏要用到两副牌和一个数轴和一个棋子。刚开始的时候棋子位于数轴的0位置。然后AekdyCoin交替的从两副牌中抽取一张牌,然后执行相应的动作。设这两幅牌为A

    2022年7月1日
    21
  • 可视化希尔排序算法是什么_希尔排序一趟排序的结果

    可视化希尔排序算法是什么_希尔排序一趟排序的结果如需转载请标明出处:https://blog.csdn.net/zhuzi9QQ技术交流群:594200841前言概念介绍希尔排序是基于插入排序算法的一种更高效的改进版本。它是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越少,当增量减少至1时,整个文件恰被分成一组。此时算法便终止。原理讲解以[41243421917]这个序列为例说明希尔排序算法的实现原理未开始遍历时,此时效果如下图由上面数组可知

    2022年10月2日
    2
  • 一些常用单位之间的换算

    一些常用单位之间的换算一些常用单位之间的换算单位表格汇总单位表格汇总请注意下方的表格:目前只对链接(也就是文字颜色有变换的那个)产生了单位的换算,其他的没有做换算,如果有清楚的可以在本篇博文下留言,正确的留言单位换算就打算加上链接,错误的就请大家帮忙纠正一下,感谢各位配合!!!常用物理量的名称、符号和单位名称…

    2022年5月14日
    171
  • SPPnet

    SPPnet目录1.Motivation2.SPPnet2.1SPP层的原理2.2SPPnet的区域映射原理3.总结论文:SpatialPyramidPoolinginDeepConvolutionalNetworksforVisualRecognition.来源:ECCV20141.MotivationR-CNN模型存在很多缺点和可改进的地方,其中的两个缺点如下:CNN网络后面接的FC层需要固定的输入大小,导致CNN也需要固定大小的输入,即要求候选区域在进入CNN前需要c

    2022年4月27日
    55
  • Iocomp.Ultra Pack V5.SP3 for .Net Crack

    Iocomp.Ultra Pack V5.SP3 for .Net CrackIocomp的UltraPack是一套56个控件,用于创建专业仪器应用程序。这些控件是用100%托管代码编写的,Ω578867473支持Microsoft和Borland/CodeGear/Embarcadero开发环境。结合了我们的ProPack和PlotPack。所有控件都是面向对象的,并共享许多公共类以保持一致性、易于使用和相互连接。每个控件都经过优化,以在.Net框架下获得最佳性能,同时仍然使用高级GDI+绘图例程,这大大改善了控件的外观。大多数控件在与应用

    2022年7月25日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号