高效 告别996,开启java高效编程之门 2-10实战:自定义函数式接口

1 有用部分

2    代码演练

1  有用部分

个人理解:

1.1  关于lambda的应用

通过 @FunctionalInterface注解 将其参数 fileContent  注入,调用的时候可以直接调取到。

服务层通过直接调用接口的方法,没有用实现类

1.2  关于文件流的读取操作

demo中设计更多的流的读取的操作

2  代码演练

需求:

将本地文件打印出来

接口:

package com.imooc.zhangxiaoxi.lambda.file;

/**
 *  接口中只有一个抽象方法,可以应用lambda表达式
 *
 *  加入注解
 *
 *  文件处理函数式接口
 */
@FunctionalInterface
public interface FileConsumer {

    /**
     * 函数式接口抽象方法
     * @param fileContent
     */
    void fileHandler(String fileContent);

}

文件服务类:

package com.imooc.zhangxiaoxi.lambda.file;

import java.io.*;

/**
 * 文件服务类
 */
public class FileService {

    /**
     * 根据url获取文件,打印文件内容
     */
    public void print(String url,FileConsumer fileConsumer) throws IOException {

        //流读取
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(url)));

        //定义行变量和内容sb
        String line =  "";
        StringBuilder stringBuilder = new StringBuilder();

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

        //调用函数式接口方法,将文件内容传递给lambda表达式
        fileConsumer.fileHandler(stringBuilder.toString());

    }
}

文件测试类:

package com.imooc.zhangxiaoxi.lambda.file;

import org.junit.Test;

import java.io.IOException;

public class FileServiceTest {

    @Test
    public void Test() throws IOException {

     //两种方式  
        //1.2
        FileService fileService = new FileService();
        fileService.print("F:/xiangmu3/Xin/test996/src/test/java/com/imooc/zhangxiaoxi/" +
                        "lambda/file/FileServiceTest.java",
                fileContent -> {
            System.out.println(fileContent);
        });

       //1.1
        /*FileService fileService = new FileService();
        fileService.print("F:/xiangmu3/Xin/test996/src/test/java/com/imooc/zhangxiaoxi/" +
                "lambda/file/FileServiceTest.java",
                fileContent -> System.out.println(fileContent));*/
    }

}

打印日志

D:\java\jdk\jdk9\jdk-9+181_windows-x64_ri\java-se-9-ri\jdk-9\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=30991:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit-rt.jar;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit5-rt.jar;F:\xiangmu3\Xin\test996\target\test-classes;F:\xiangmu3\Xin\test996\target\classes;F:\xiangmu3\Xin\test996\lib\com\google\guava\guava\28.2-jre\guava-28.2-jre.jar;F:\xiangmu3\Xin\test996\lib\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;F:\xiangmu3\Xin\test996\lib\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;F:\xiangmu3\Xin\test996\lib\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;F:\xiangmu3\Xin\test996\lib\org\checkerframework\checker-qual\2.10.0\checker-qual-2.10.0.jar;F:\xiangmu3\Xin\test996\lib\com\google\errorprone\error_prone_annotations\2.3.4\error_prone_annotations-2.3.4.jar;F:\xiangmu3\Xin\test996\lib\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;F:\xiangmu3\Xin\test996\lib\junit\junit\4.12\junit-4.12.jar;F:\xiangmu3\Xin\test996\lib\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;F:\xiangmu3\Xin\test996\lib\com\alibaba\fastjson\1.2.58\fastjson-1.2.58.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.imooc.zhangxiaoxi.lambda.file.FileServiceTest,Test
package com.imooc.zhangxiaoxi.lambda.file;

import org.junit.Test;

import java.io.IOException;

public class FileServiceTest {

    @Test
    public void Test() throws IOException {
        //1.2
        FileService fileService = new FileService();
        fileService.print("F:/xiangmu3/Xin/test996/src/test/java/com/imooc/zhangxiaoxi/" +
                        "lambda/file/FileServiceTest.java",
                fileContent -> {
            System.out.println(fileContent);
        });

       //1.1
        /*FileService fileService = new FileService();
        fileService.print("F:/xiangmu3/Xin/test996/src/test/java/com/imooc/zhangxiaoxi/" +
                "lambda/file/FileServiceTest.java",
                fileContent -> System.out.println(fileContent));*/
    }

}

Process finished with exit code 0

原文地址:https://www.cnblogs.com/1446358788-qq/p/12630756.html

时间: 2024-10-31 11:41:03

高效 告别996,开启java高效编程之门 2-10实战:自定义函数式接口的相关文章

高效 告别996,开启java高效编程之门 2-8实战:判断逻辑参数化-Lambda表达式

0 有用部分 1    函数式编程简介 2    函数式编程和lambda的关系 3    lambda表达式应用范围 4    lambda应用的五个案例 5    函数式编程应用条件 6 提出问题 0 有用部分 4 lambda应用的五个案例 5 函数式编程应用条件 6 提出问题 本节主要介绍了lambda的使用方式,具体demo参照2-10 和2-15 1 函数式编程简介 函数式编程是一种不同的编程思想,定义函数作为公民,可以赋值给变量,作为参数或者返回值来传递 2 函数式编程和lambd

高效 告别996,开启java高效编程之门 3-2传统方式处理业务逻辑

1 重点 1.1 对sort方法使用的理解 2 代码演练 需求: 根据第一章需求,女盆友提出需求* 1 打印所有商品* 2 图书类的商品一定给买* 3 最贵的买两件* 4 打印最贵的两件商品的名称和总价 测试类: package com.imooc.zhangxiaoxi.stream; import com.alibaba.fastjson.JSON; import com.imooc.zhangxiaoxi.lambda.cart.CartService; import com.imooc.

高效 告别996,开启java高效编程之门 3-7实战:常用中间操作演示之:过滤/映射/扁平化 filter/map/flagMap

1 重点 filter方法的使用 map方法的使用 flatMap方法的使用 forEach方法的使用 2 map和flatMap的区别: map的作用很容易理解就是对rdd之中的元素进行逐一进行函数操作映射为另外一个rdd. flatMap的操作是将函数应用于rdd之中的每一个元素,将返回的迭代器的所有内容构成新的rdd.通常用来切分单词,可用来单词计数 3 实战演示之过滤(filter): package com.imooc.zhangxiaoxi.stream; import com.al

高效 告别996,开启java高效编程之门 2-15方法引用精讲

2-14课程和2-12重复了,所以没有发出来 1 方法引用使用条件 判断方法引用 是否满足场景的要求的时候,只需要看我们的出参和入参是否满足接口的要求即可 2 方法引用场景 四种方法引用类型: 指向静态方法 Class::staticMethod指向现有对象的实例方法 object::instanceMethod指向任意类型的实例方法 C1ass::instanceMethod指向构造方法 Class::new 3 方法引用demo package com.imooc.zhangxiaoxi.l

高效 告别996,开启java高效编程之门 3-6流操作分类

1 重点 理解流程操作分类 常用的方法 2 Stream流操作分类: 2.1 流操作分类之中间操作(Intermediate): 无状态操作——filter/map/peek等有状态操作——dictinct/sorted/limit等 2.2 流操作分类之终端操作(Termina1):非短路操作——forEach/collect/count等短路操作——anyMatch/findFirst/findAny等 2.3 有状态操作无状态操作区别: 无状态操作: 比如map或者filter会从输入流中

高效 告别996,开启java高效编程之门 3-5 Stream流概念解析

3-4讲的没有意义,直接过了 1 重点 概念解析中的定义 Stream流的组成 Stream流和集合的区别 2 概念解析 定义: 从支持数据处理操作的源生成的元素序列. 解释: 元素序列:和集合一样,流也是一个接口,可以访问特定元素类型的一组有序值,有序值就是元素序列 源:为流提供数据的源头,比如集合,数组,都可以称之为源. 数据处理操作:流的数据处理操作支持类似与数据库的操作(map,sort,limit)以及函数式编程语言中的一些常用操作. 功能: ◆JDK1.8引入的新成员,以声明式方式处

Java 函数式接口

目录 Java 函数式接口 1. 函数式接口 1.1 概念 1.2 格式 1.3 函数式接口的使用 2. 函数式编程 2.1 Lambda的延迟执行 2.2 使用Lambda作为方法的参数&返回值 3. 常用的函数式接口 3.1 Supplier<T>接口 3.2 Consumer<T>接口 3.3 Predicate<T>接口 3.4 Function<T, R>接口 Java 函数式接口 1. 函数式接口 1.1 概念 函数式接口:有且只有一个抽

【Java系列教程】一起爪哇Java 8(一)——函数式接口

引言 目前由于系统已经全面切换为JDK8,所以有必要系统的了解一下Java8的一些新特性,以便后续在日常工作中可以使用一些高级特性来提高编程效率. 因为Java8引入了函数式接口,在java.util.function包含了几大类函数式接口声明.这里第一篇主要研究一下Function相关的接口. FunctionalInterface注解 Java8的新引入,包含函数式的设计,接口都有@FunctionalInterface的注解.就像这个注解的注释说明一样,它注解在接口层面,且注解的接口要有且

Java之函数式接口

函数式接口 概述:接口中只有一个抽象方法 下面介绍的可能很抽象,理解不了,至少在我看来单独的这几个借口是没有用的,跟最下面说的 Stream流一起用才会有效果 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适用于Lambda使用的接口.只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导. 备注:"语法糖"是指使用更加方便,但是原理不变的代码语法.例如在遍历集合时使用的for-each语法,其实