函数式编程

本文介绍了JDK1.8的Lambda表达式、方法引用和内建函数式接口。Lambda表达式支持函数式编程,可避免面向对象编程的繁琐,使用需满足SAM要求;方法引用有引用静态方法、实例对象方法等四种形式;内建函数式接口包括功能型、消费型、供给型和断言型。

1、Lambda表达式

从JDK1.8开始为了减缓使用者进行代码开发,专门提供了Lambda表达式支持,利用此操作形式可以实现函数式的编程。比较著名的函数式编程语言:Haskell、Scala。利用函数式编程可以避免一些面向对象编程中的一些繁琐的处理问题。

分析传统匿名内部类:

interface IChannel {
    public void send(String str) ;
}
public class LambdaDemo {
    public static void main(String[] args) {
        IChannel ic = new IChannel() {
            public void send(String str) {
                System.out.println(str) ;
            }
        };
        ic.send("一只瓶子a");
    }
}

在这样一个程序里核心功能:“ System.out.println(str) ;”,为此一行核心语句仍需要按照完整的面向对象给出的设计结构进行开发。

使用Lambda表达式实现:

@FunctionalInterface //标记为函数式接口
interface IChannel {
    public void send(String str) ;
}
public class LambdaDemo {
    public static void main(String[] args) {
        IChannel ic = (str)->{
            System.out.print(str);
        };

        ic.send("一只瓶子a");
    }
}

Lambda表达式使用时的重要实现要求:SAM(Single Abstract Method),只有一个抽象方法(可以有其他方法)——函数式接口。只有函数式接口才能使用Lambda表达式。

Lambda表达式的几种格式:

①方法没有参数:()-> {}

②方法有参数:(参数,参数)-> {}

③只有一行返回语句:(参数,参数)-> 语句;

2、方法引用

从JDK1.8之后提供有方法的引用,即,不同的方法名称可以描述同一个方法。四种形式:

①引用静态方法:类名称 ::static 方法名称

@FunctionalInterface //标记为函数式接口
//P描述的是参数类型,R描述的是返回值类型
interface IChannel<P,R> {
    public R change(P p) ;
}

public class LambdaDemo {
    public static void main(String[] args) {
        // 引用String类中的静态方法valueOf()
        IChannel<Integer, String> ic = String :: valueOf ;
        String str = ic.change(100);
        System.out.println(str.length());
    }
}

②引用某个实例对象的方法:实例化对象 ::普通方法

// 引用某个实例对象的方法
IFunction<String> fun = "aaa"::toUpperCase;

③引用特定类的方法:特定类::普通方法

// 引用特定类中的方法
IFunction<String> fun = String::compareTo;

④引用构造方法:类名称::new

3、内建函数式接口(系统提供)

在java.util.function开发包里有可以直接使用的函数式接口。核心接口:

①功能型函数接口

接口定义:接收一个参数并返回一个参数

@FunctionalInterface 
public interface Function<T,R> {
    public R apply​(T t)
}

例:

public class LambdaDemo {
    public static void main(String[] args) {
        //使用内建函数式接口,引用实例对象的方法
        Function<String,Boolean> fun = "**hello" :: startsWith ;
        System.out.println(fun.apply("**"));
    }
}

②消费型函数式接口:只进行数据处理,不返回

@FunctionalInterface
public interface Consumer<T>{
    public void accept​(T t);
}

例:

Consumer<String> con = System.out :: println ;
con.accept("aaaa"); //输出aaaa

③供给型函数式接口:不接收参数

@FunctionalInterface
public interface Supplier<T>{
    public T get​();
}

例:

Supplier<String> sup = "aAa" :: toLowerCase ;
System.out.println(sup.get());

④断言型函数式接口:输出为boolean型

@FunctionalInterface
public interface Predicate<T>{
    public boolean test​(T t);
}
例:

Predicate<String> pre = "a" :: equalsIgnoreCase ;
System.out.println(sup.test("A"));  //输出true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值