zoukankan      html  css  js  c++  java
  • Java函数式编程、lambda表达式

    Java函数式编程、lambda表达式

    Java8开始支持函数式编程、包括lambda表达式、Stream流。

    函数式编程用于简化开发,对于某些类,或许只使用一次,那么就没必要对其进行单独的实现一个类,java原本提供了简化的方案,如内部类、匿名内部类等。

    lambda对此更加简化。

    函数式接口

    函数式接口就是只有一个方法的接口,想想函数是不是一个个是独立的。

    Runnable接口就是一个函数式接口,如下:

    @FunctionalInterface
    public interface Runnable {
     
        public abstract void run();
    }
    
    
    //@FunctionalInterface注解代表这是一个函数式接口,但不是必须的,加上注解jvm会帮助检查。
    // public abstract void run();中的abstract也可以省略,接口中的方法本就是抽象方法
    

    使用了函数式接口后,就不需要实现类,直接使用lambda即可。

    lambda表达式

    lambda用于替代实现类,形式如下:

    FunctionalInterface func=()->{
               ......
            };
    

    实例

    函数式接口

    @FunctionalInterface
    interface Func{
    
        void  hello();
    }
    

    lambda表达式

    public class LambdaDemo  {
    
        public static void main(String[] args) {
            Func func=()->{
                System.out.println("hello");//lambda表达式
    
            };
    
             func.hello();//调用方法
    
        }
    }
    

    带返回值

    直接在抽象方法前加上返回类型,在lambda中有返回值即可。

    public class LambdaDemo  {
    
        public static void main(String[] args) {
            Func func=()->{
                System.out.println("hello");
                return "ok lambda";
    
            };
    
            String s = func.hello();
            System.out.println(s);
    
        }
    }
    
    
    @FunctionalInterface
    interface Func{
    
        String  hello();
    }
    
    

    带参数

    参数声明在抽象方法中,在lambda中加上类型即可:

    public class LambdaDemo  {
    
        public static void main(String[] args) {
            Func func=(int a,String c)->{
                System.out.println("hello"+a+c);
                return "ok lambda";
    
            };
    
            String s = func.hello(8,"yes");
            System.out.println(s);
    
        }
    }
    

    lambda中的数据类型可以略去

    Func func=( a,c)->{
                System.out.println("hello"+a+c);
                return "ok lambda";
    
            };
    

    如果只有一个参数的话,连()都可以省略。

    public class LambdaDemo  {
    
        public static void main(String[] args) {
            Func func=c->{            //lambda省去()
                System.out.println("hello "+c);
                return "ok lambda";
    
            };
    
            String s = func.hello("yes");
            System.out.println(s);
    
        }
    }
    
    
    @FunctionalInterface
    interface Func{
    
        String  hello(String b);
    }
    
    

    内置函数式接口

    JDK 1.8为我们预定义了许多函数式接口,它们位于java.util.function包中。

    常用的如下:

    序号 接口名 抽象方法 说明
    1 Supplier Tget() 无输入参数,通过一系列操作产生一个结果返回
    2 Consumer voidaccept(Tt) 一个输入参数,针对参数做一系列操作,无返回值
    3 Function<T,R> Rapply(Tt) 一个参数,一个返回值,针对参数生成一个返回值
  • 相关阅读:
    opencv-霍夫直线变换与圆变换
    opencv-角点检测之Harris角点检测
    opencv-图像形态学之开运算、闭运算、形态学梯度、顶帽、黑帽合辑
    opencv-图像形态学之膨胀腐蚀
    MFC-按行读取TXT数据
    MFC-CString与int互相转化
    转-C++宏定义详解
    转-pycharm建立项目
    转-Windows下anaconda简单使用教程
    CSU 1556 Jerry's trouble
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/12157688.html
Copyright © 2011-2022 走看看