• Java8函数式编程-lambda表达式与stream流


    前言

    lambda表达式和stream流是Java8中的新特性,然后如今也远远不能算上新了,但这种写法相比传统还是有很大的改观,在简洁代码的同时又不失可读性,这种可读性可以说是在代码语言之前的传统形式,对于编码者是新的形式,但对于初学者也许是更容易理解的,本篇文章主要结合《Java8函数式编程》书来总结一些学习经验

    lambda表达式

    lamda表达式是用来简化一些代码,首先看一个swing的原代码

    button.addActionListener(new ActionListener(){
    	public void actionPerformed(ActionEvent event){
    		System.out.println("button clicked");
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个方法实现了actionListener接口,通过重写actionPerformed,实现了一个输出动作
    下面是简化后的代码

    button.addActionListener(event->	System.out.println("button clicked"));
    
    • 1

    这里括号内相当于一个无名函数,箭头左边是参数,右边是la’mbda表达式
    event 直接声明,不需要带类型,因为利用了javac的上下文推断其类型,根据addActionListener推断出类型ActionListener

    各种形式

    lambda表达式还有一些变体

    Runnable noArguments = () ->System.out.println
    
    • 1

    括号为空代表无参数,因为run方法也无参且返回类型为void

    ActionListener oneArgument = event ->	System.out.println("button clicked")
    
    • 1

    这种包含一个参数,且可省略

    Runnable multiStatement = ()->{
    	System.out.println("button clicked")
    }
    
    • 1
    • 2
    • 3

    主体可以用大括号,标识表达式的开始结束,可以用return和异常退出

    BinaryOperator<Long> add  =(x,y)->x+y;
    
    • 1

    多个参数,注意这里的尖括号里有类型,是为了方便编译器推断,如果不写默认为object类型,object 类型相加就会报错

    引用“值”

    final可以在第一次赋值后不再变化,引用这个变量就可以获取第一次的值,在lambda中可以直接引用值
    原代码如下

    final String name =getUserName();
    button.addActionListener(new ActionListener(){
    	public void actionPerformed(ActionEvent event){
    		System.out.println("hi"+name);
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    简化后

    String name = getUserName();
    button.addActionListener(event->System.out.println("hi"+name));
    
    • 1
    • 2

    这里的name也是final的,如果多次赋值,也是会报错的

    类型推断

    之前有类型推断的例子,这里补充一个

    Predicate<Integer> atLeast5 = x ->x >5;
    
    
    • 1
    • 2

    x>5返回一个布尔类型,是表达式的主体
    下面是Predicate接口的源代码

    public interface Predicate<T>{
    	boolean test(T t);
    }
    
    • 1
    • 2
    • 3

    Stream流

    Stream流主要是针对for循环进行简化,事实上for循环也是对Iterator的hasNext进行的简化

    int count =0;
    for(Artist artist: allArtist){
    	if(artist.isFrom("London")){
    		count++;		
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    简化后

    long count = allArtists.stream().filter(artist.isFrom("London")).count();
    
    • 1

    stream对allAritists进行遍历,筛选出里面符合之后的条件的对象,作为一个集合,count再对这个集合进行求值

  • 相关阅读:
    从数学0到指针NULL,到std vector右边界,到空操作
    点击一张图片,到最后渲染到屏幕,都经历了哪些流程?
    Xshell+screen解决ssh连接 服务器掉线的问题
    【算法篇-字符串匹配算法】BF算法和KMP算法
    GPTs Hunter 是什么?
    Vue的数据来源详解
    使用tomcat来部署jenkins
    MySQL自增主键和手动生成主键区别
    SQLite 学习笔记1 - 简介、下载、安装
    JS实现视频录制-以Cesium为例
  • 原文地址:https://blog.csdn.net/qq_39167720/article/details/134044826