java之函数编程(代码片段)

一步一步往上爬的小蜗牛 一步一步往上爬的小蜗牛     2022-12-11     632

关键词:

前言

        本系列文章为在《告别996,开启Java高效编程之门》学习过程中的学习笔记和课外资料补充,希望可以方便自己和其他需要的同学查阅。

Lambda表达式简介

        ①Java8引入的函数式编程风格;

        ②可以理解为一种匿名函数的代替;

        ③通过行为参数传递代码。

Lambda表达式的形式

        (parameters) -> expression

        (parameters) -> statement;

形式一:没有参数

 () -> System.out.println("Hello World!");

形式二:只有一个参数

name -> System.out.println("Hello World from " + name + " !");

形式三:没有参数,逻辑复杂

() -> 

        System.out.println("Hello");

        System.out.println("World!");

    

形式四:包含两个参数的方法

BinaryOperator<Long> functionAdd = (x,y) -> x + y;

Long result = functionAdd.apply(1L, 2L);

形式五:对参数显式声明

BinaryOperator<Long> functionAdd = (Long x, Long y) -> x + y;

Long result = functionAdd.apply(1L, 2L);

函数式接口

        ①接口中只有一个抽象方法;

        ②Java8的函数式接口注解: @FunctionInterface ;

        ③函数式接口的抽象方法签名:函数描述符。

实战案例:自定义函数式接口

        自定义函数式接口,实现读取本地文件后自定义处理逻辑功能。

        1.定义函数式接口

/**

* 文件处理函数式接口

*/

@FunctionalInterface

public interface FileConsumer 

    /**

     * 函数式接口抽象方法

     * @param fileContent - 文件内容字符串

     */

    void fileHandler(String fileContent);

        2.通过url获取本地文件内容,调用函数式接口进行处理

package com.pino.lambda.file;

import java.io.*;


public class FileService 
    /**
     * 通过url获取本地文件内容,调用函数式接口进行处理
     * @param url
     * @param fileConsumer
     * @throws IOException
     */
    public void fileHandle(String url, FileConsumer fileConsumer) throws IOException 
        //创建文件读取流
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(url)));
        //定义行变量和内容sb
        String line;
        StringBuilder sb = new StringBuilder();

        //循环读取文件内容
        while ((line = bufferedReader.readLine()) != null) 
            sb.append(line + "\\n");
        

        //调用函数式接口方法,将文件内容传递给lambda表达式,实现业务逻辑
        fileConsumer.fileHandler(sb.toString());

    

        3.测试用例

package com.pino.lambda.file;

import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.*;


public class FileServiceTest 

    @Test
    public void fileHandle() throws IOException 
        FileService fileService = new FileService();
        fileService.fileHandle("E:\\\\learn\\\\996\\\\src\\\\test\\\\com\\\\pino\\\\lambda\\\\file\\\\FileServiceTest.java", fileContent -> 
            System.out.println(fileContent);
        );
    

        4.测试结果

常用函数接口及使用

接口

参数

返回类型

描述

Predicate<T>

T

boolean

用于判别一个对象。比如判断一个人是否为男性。

Consumer<T>

T

void

用于接收一个对象进行处理但没有返回,比如接收一个人并打印他的名字。

Function<T, R>

T

R

转换一个对象为另一个不同类型的对象。

Supplier<T>

None

T

提供一个对象。

UnaryOperator<T>

T

T

接收对象并返回同类型的对象。

BinaryOperator<T>

(T, T)

T

接收两个同类型的对象,并返回一个原类型对象。

方法引用

        方法引用是调用特定方法的Lambda表达式的一种快捷写法,可以让你重复使用现有的方法定义,并像Lambda表达式一样传递它们。

        格式如下:

Optional.ofNullable(cartSkuList)
                    .map(List::stream)
                    .orElseGet(Stream::empty)
                    .sorted(Comparator.comparing(Sku::getTotalNum))
                    .forEach(resultSkuList::add);

        ①指向静态方法的方法引用:

/**
* (args) -> ClassName.staticMethod(args);
* ClassName::staticMethod
*/
public void test1() 
    Consumer<String> consumer1 = (String number) -> Integer.parseInt(number);

    Consumer<String> consumer2 = Integer::parseInt;

        ②指向任意类型实例方法的方法引用:

/**
* (args) -> args.instanceMethod();
* ClassName::instanceMethod
*/
public void test2() 
    Consumer<String> consumer1 = (String str) -> str.length();

    Consumer<String> consumer2 = String::length;

        ③指向现有对象的实例方法的方法引用:

/**
* (args) -> object.instanceMethod(args);
* object::instanceMethod
*/
public void test3() 
    StringBuilder sb = new StringBuilder();

    Consumer<String> consumer1 = (String str) -> sb.append(str);

    Consumer<String> consumer2 = sb::append;

 参考链接:https://blog.csdn.net/icarusliu/article/details/79495534

java之函数编程(代码片段)

...他需要的同学查阅。Lambda表达式简介    ①Java8引入的函数式编程风格;    ②可以理解为一种匿名函数的代替;    ③通过行为参数传递代码。Lambda表达式的形式        (parameters)->expression        (parameter... 查看详情

java并发编程之美之并发编程线程基础(代码片段)

...线程,进程的多个线程共享进程的资源。  java启动main函数其实就是启动了一个JVM的进程,而main函数所在的线程就是这个进程的一个线程,也称主线程。进程和线程关系    一个进程有多个线程,多个线程共享进程的堆和... 查看详情

java高阶进阶之java函数式编程-stream流-lambda表达式(代码片段)

...dk1.8中新增了流Stream,和Lambda表达式Stream流、Lambda表达式是函数式编程思想,可以让我们不用关注什么对象,而是关注对数据进行了什么操作,Stream可以很方便对我们的集合数组进行操作。并且在大数据下处理效果高&#x... 查看详情

java高阶进阶之java函数式编程-stream流-lambda表达式(代码片段)

...dk1.8中新增了流Stream,和Lambda表达式Stream流、Lambda表达式是函数式编程思想,可以让我们不用关注什么对象,而是关注对数据进行了什么操作,Stream可以很方便对我们的集合数组进行操作。并且在大数据下处理效果高&#x... 查看详情

java8新特性之lambda(代码片段)

...递到各处。一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评。随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程。否 查看详情

java8新特性之lambda(代码片段)

...递到各处。一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评。随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程。否则,Java将会变得没有价值。Java8在使世界上最受欢迎的... 查看详情

网络编程之select(代码片段)

一select函数简介  select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv,recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执... 查看详情

rxjs入门之函数响应式编程(代码片段)

一.函数式编程1.声明式(Declarativ)和声明式相对应的编程?式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的?种编程?式。//命令式编程:functiondouble(arr)constresults=[]for(leti=0;i<arr.length;i++)results.push(arr[i]*2)returnresult... 查看详情

shell之函数(代码片段)

前言  Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。Shell中的函数和C++、Java、Python、C#等其它编程语言中的函数类似,只是在语法细节有所差别。 ... 查看详情

运维linuxshell编程之函数使用(代码片段)

前言使用linux的shell编程,可以说函数是非常重要的内容,也是在编写各类shell脚本的时候经常用到的,本篇将介绍下函数相关的使用。shell函数分类系统函数自定义函数系统函数系统函数为linux自带的函数,可以在shell... 查看详情

cmd运行java文件不显示——stream代码简洁之道的详细用法(代码片段)

...处理数据的方式。Java8中之所以费这么大的功夫引入 函数式编程 ,原因有两个:代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。多核友好,Java函数式编程使得编写并行程序从未如此... 查看详情

函数式编程之-f#类型系统(代码片段)

在深入到函数式编程思想之前,了解函数式独有的类型是非常有必要的。函数式类型跟OO语言中的数据结构截然不同,这也导致使用函数式编程语言来解决问题的思路跟OO的思路有明显的区别。什么是类型?类型在编程语言中有... 查看详情

socket编程之使用fsockopen()函数(代码片段)

fsockopen函数:初始化一个套接字连接到指定主机(hostname)get方式:client.php1<?php2//创建连接3$fp=fsockopen(‘localhost‘,80,$error,$errstr,10);45//检测6if(!$fp)7echo$errstr;die;8910//拼接http请求报文11$http=‘‘;1213//请求报文包括3部分请求行请... 查看详情

java之socket编程(nio多路复用器)(代码片段)

...ctionKey.channel()获取一个channel。selector.select()是一个阻塞型函数,得有事件触发他的执行,他执行之后,可以通过 selector.selec 查看详情

函数式编程之-重新认识泛型(代码片段)

...把泛型也叫做类型提升(lifting),这样带来的问题是以往的函数不能再适应提升类型,试想之前已经存在一个a->b的函数,但是此时你拥有一个E<a>变量,你无法直接把E<a>传入到a->b的函数中。上一节还提到,一旦你的... 查看详情

es6异步编程解决方案之async(代码片段)

一、async函数的基本用法async函数返回一个Promise对象,可以使用then、catch方法添加回调函数async函数执行时,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句【异步函数同步执行】async函数有很多种... 查看详情

020-并发编程-java.util.concurrent之-jdk6/7/8中concurrenthashmaphashmap分析(代码片段)

...表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。  给定表M,存在函数f(key) 查看详情

[读书笔记]java编程思想第4章之控制执行流程(代码片段)

...分逗号操作符和逗号分隔符:用作分隔符时用来分隔函数的不同参数;Java里唯一用到逗号操作符的地方就是for循环的控制表达式,可以在for语句内定义多个变量,但是它们必须具有相同的类型。Java编译器生成它... 查看详情