zoukankan      html  css  js  c++  java
  • Java 8-lambda表达式及方法引用

    Lambda表达式

       Lambda表达式是一个类似于匿名函数的语法糖,它实现一个函数式接口,它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。

      一个 Lambda 表达式可以有零个或多个参数

      参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)(a)效果相同

      所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)

      空圆括号代表参数集为空。例如:() -> 42

      当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a

      Lambda 表达式的主体可包含零条或多条语句

      如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致

      如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。

      匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

    什么是函数式接口

    在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口

    每个 Lambda 表达式都能隐式地赋值给函数式接口,例如,我们可以通过 Lambda 表达式创建 Runnable 接口的引用。

      Runnable r = () -> System.out.println("hello world");

    当不指明函数式接口时,编译器会自动解释这种转化:

    new Thread(
         () -> System.out.println("hello world")
      ).start();

    因此,在上面的代码中,编译器会自动推断:根据线程类的构造函数签名,

     public Thread(Runnable r) { }

    将该 Lambda 表达式赋给 Runnable 接口

    以下是一些 Lambda 表达式及其函数式接口:

    四大核心函数式接口

       public void testCoreInter(){
            /**
             * @name 消费型接口
             * @use Consumer<T>
             * @param T 传入参数
             * @fun 接受一个参数 无返回值
             * */
            Consumer<String> con=(str)->System.out.println(str);
            con.accept("我是消费型接口!");
    
            /**
             * @name 供给型接口
             * @use Supplier<R>
             * @param R 返回值类型
             * @fun 无参数 有返回值
             * */
            Supplier<Date> supp=()-> new Date();
            Date date=supp.get();
            System.out.println("当前时间:"+date);
    
            /**
             * @name 函数型接口
             * @use Function<T,R>
             * @param T 传入参数
             * @return R 返回值类型
             * @fun 接受一个参数 有返回值
             * */
            Function<String, String> fun=(str)->"hello,"+str;
            String str=fun.apply("张俊强");
            System.out.println(str);
            /**
             * @name 断定型接口
             * @use Predicate<T>
             * @param T 传入参数
             * @return Boolean 返回一个Boolean型值
             * @fun 接受一个参数 返回Boolean型值
             * */
            Predicate<Integer> pre=(num)->num>0;
            Boolean flag=pre.test(10);
            System.out.println(flag);
        }
    --------------------- 
    
    来源:CSDN 
    原文:https://blog.csdn.net/zjq_1314520/article/details/73556167 

    自定义函数式接口

    @FunctionalInterface
    public interface WorkerInterface {
    
        void doSomeWork();
    
    }

    函数式接口中允许定义默认方法和静态方法。

    方法引用

      (注意:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!)

    • 构造器引用

       Class::new(类名::new)

       注意:构造器的参数列表,需要与函数式接口参数列表保持一致。(如Supplier函数式接口对应无参数构造器)

    • 方法引用

      • 静态方法引用;

        Class::static_method(类名::静态方法)

      • 实例方法引用;

        instance::method(实例名:方法)

    • 数组引用

       类型[]::new

    ...

  • 相关阅读:
    linux shell习题
    The logback manual #02# Architecture
    The logback manual #01# Introduction
    算法导论(第三版)练习 10.1-1 ~ 10.1-7
    算法笔记 #006# 快速排序 × 算法导论(第三版)练习 7.1-1 ~ 7.1-4
    Linux笔记 #08# shell编程从零开始到低配学生管理系统
    Maven笔记 #01# 入门
    Java日志学习资料收集
    jsp中用EL读取了数据库里面的时间,怎么设置格式显示的格式
    ajax异步处理时,如何在JS中获取从Servlet或者Action中session,request
  • 原文地址:https://www.cnblogs.com/oliverBolg/p/10083266.html
Copyright © 2011-2022 走看看