lambda表达式概述

Lambda简介

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效 如

 

 

lambda前置条件

必须是函数式接口才可以使用lambda表达式

函数式接口特征:

接口中标注了@FunctionInterface注解
接口中只有一个抽象方法,则该接口会被编译器自动识别成函数式接口
接口中有一个抽象方法,同时包含了Object类的其他抽象方法,则该接口也会被识别成函数式接口

lambda表达式的形式

   1、没有参数  () -> System.out.println("hello word");
   2  只有一个参数 name -> System.out.println("hello word" + name );
   3、没有参数逻辑复杂 () -> { 这里代表两行代码以上 }
   4、包含两个参数的方法  
    BinaryOperator<Long> function = (x,y) -> x+y;
    Long apply = function.apply(1l, 2l);
    注:BinaryOperator 这个接口在  java.util.function;包下
    5、对参数显示声明
    BinaryOperator<Long> function = (Long x, Long y) -> x+y;
    Long apply = function.apply(1l, 2l);

实战 实现自定义函数式接口

实现读取本地文件 自定义处理逻辑功能

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

    /**
     * 通过url获取本地文件内容,调用函数式接口处理
     *
     * @param url
     * @param fileConsumer
     */
    public void fileHandle(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());
    }
}

//测试
    public void fileHandle() throws IOException {
        FileService fileService = new FileService();
        fileService.fileHandle("D:\\work\\source\\学习\\996\\src\\test\\" +
                        "java\\com\\gc\\guoshicheng\\lambda\\file\\FileServiceTest.java",
                fileContent -> {
                    //输出了文件的长度,和内容
                    System.out.println(fileContent.length());
                    System.out.println(fileContent);
                }
        );
    }

常用函数接口 及使用

 

 

 

例如

//将 user 转换成 String
class User {
    String user;
}

 public String userToSting(User user, Function<User, String> function) {
        return function.apply(user);
    }
    
    //测试
     User user = new User();
     user.user = "123";
     String s = fileServiceTest.userToSting(user, user1 -> {
     String str = user1.user;
     return str;
});

方法引用

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

 指向静态方法的方法引用
    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 stringBuilder = new StringBuilder();
    Consumer<String> consumer1 = (String str) -> stringBuilder.append(str);
    //简写为
    Consumer<String> consumer2 = stringBuilder::append;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值