编程范式-Java函数式编程

编程范式

  • 命令式编程
  • 函数式编程
  • 响应式编程

函数式编程

释义:

通过函数来定义、封装及组合计算逻辑。其核心特性之一是数据不可变性(immutability),即数据一旦被创建,其值便固定不变,无法被后续操作修改。这一特性促使函数式编程倾向于避免使用状态(state)和可变变量(mutable variables),转而采用高阶函数(能够接受函数作为参数或返回函数的函数)以及纯函数(在给定相同输入条件下,始终产生相同输出的函数)作为构建程序的基本构件。函数式编程强调使用纯函数。

特点:

1. 把计算视为函数的求值。强调数据的映射和转换。
2. 不允许状态变化。函数的输出仅由输入决定。
3. 鼓励不可变数据。数据一旦创建就不能更改。
4. 倡导高阶函数。函数可以作为参数或返回值。

Java函数式编程

Lambda

释义:

它允许将函数作为方法的参数或返回值,简化了代码,支持函数式编程,Lambda表达式的引入解决了匿名内部类代码冗余的问题,并支持并行编程。‌Lambda 表达式产生函数,而不是类。

基本语法:

(参数列表) -> {函数体}

方法引用:

由类名或者对象名,后面跟着 :: 然后跟方法名称
构造函数引用:ClassName::new

  • 方法引用在很大程度上可以理解为创建一个函数式接口的实例
  • 方法引用实际上是一种简化 Lambda 表达式的语法糖,它提供了一种更简洁的方式来创建一个函数式接口的实现
  • 在代码中使用方法引用时,实际上是在创建一个匿名实现类,引用方法实现并且覆盖了接口的抽象方法
  • 方法引用大多用于创建函数式接口的实现

使用场景:

Lambda表达式广泛应用于集合操作、线程创建、事件处理等场景。例如,在集合操作中,可以使用Lambda表达式来遍历集合并处理每个元素;在线程创建中,可以使用Lambda表达式来定义线程的行为;在事件处理中,可以将Lambda表达式作为事件处理函数的参数。‌

函数式接口

  • 只包含一个抽象方法(Single Abstract Method,简称SAM)的接口,称为函数式接口。当然该接口可以包含其他非抽象方法。
  • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
  • 在java.util.function包下定义了Java 8 的丰富的函数式接口

Java8使用示例:

public class Func {

    /**
     * 函数式接口:String转Integer
     * 接受一个参数,返回一个结果
     */
    private static Function<String,Integer> f1 = i-> Integer.valueOf(i);

    /**
     * 函数式接口:接受一个 int 参数,返回一个结果
     */
    private static IntFunction<Integer> f2 = i->i*10;

    private static LongFunction<String> f3 = l->String.valueOf(l);
    private static ToIntFunction<Long> f5 = l->BigInteger.valueOf(l).intValue();

    /**
     * 函数式接口:无参,返回一个结果
     */
    private static Supplier<Date> s = ()->new Date();

    private static Comparator<Long> c =  (l1,l2)->l1-l2>0?1:-1;

    /**
     * 接收一个参数,无返回值
     */
    private static Consumer<Integer> cs = i->{
        ConsumerInt ci = j-> System.out.println(j%2);
        ci.remainder(i);
    };

    /**
     * 接收一个参数,返回boolean值
     */
    private static Predicate<Integer> p = Predicate1::taller;

    public static void main(String[] args) {
        Integer i = f1.apply("11");
        System.out.println(i);

        System.out.println(f2.apply(897));
        System.out.println(f3.apply(3564735472l));
        System.out.println(f5.applyAsInt(3564735472l));
        System.out.println(s.get());
        System.out.println(c.compare(789l,528l));
        cs.accept(13);
        System.out.println(p.test(179));
    }
}
//方法引用定义
public class Predicate1 {
    public static boolean taller(Integer height){
        return height-180>0?true:false;
    }
}
//函数式接口定义
public interface ConsumerInt {
    void remainder(Integer u);
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值