常用Lambda函数式接口

常用Lambda函数式接口

1-概述

有且只有一个抽象方法,为Lambda准备的接口

都是由@FunctionalInterface进行的注解

2-函数式接口作为方法的参数

创建线程,用的最多且经典的Lambda使用

/**
 * @author Object(object_hui@sina.com)
 * @description Lambda创建线程
 * @date 2020/9/22
 */
public class Demo01 {
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("使用内部类创建了一个线程!");
            }
        }).start();

        new Thread(() -> System.out.println("省略写法的Lambda创建的线程类")).start();

    }
}

3-函数式接口作为方法的返回值

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * @author Object(object_hui@sina.com)
 * @description 函数式接口作为方法的返回值
 * @date 2020/9/22
 */
public class Demo02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("111");
        list.add("333");
        list.add("555");
        list.add("222");
        list.add("666");
        list.add("888");
        System.out.println("调用排序前");
        System.out.println(list);
        System.out.println("调用排序后");
        //调用集合排序方法,传入集合和比较器
        Collections.sort(list,getCompartor());
        System.out.println(list);


    }

    public static Comparator<String> getCompartor(){
        //两种写法等价,通过Lambda实现函数式接口返回一个比较器
//        return (o1, o2) -> o1.compareTo(o2);
        return String::compareTo;
    }
}

4-常用的函数式接口

4.1-Supplier

生产接口,我们通常用这个接口来获取一个可操作的数据

import java.util.function.Supplier;

/**
 * @author Object(object_hui@sina.com)
 * @description Supplier测试类
 * @date 2020/9/22
 */
public class SupplierDemo {
    public static void main(String[] args) {
        //使用生产者接口获取一个Integer类型的数
        Integer integer = getInteger(() -> 1314);
        System.out.println(integer);

        //使用生产者接口获取一个String类型的数
        String str = getString(() -> "1314");
        System.out.println(str);
        //使用生产者接口返回一个数组中的最大值
        int[] arr = {45,78,22,63};
        Integer max1 = getMax(() -> {
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if (max < arr[i])
                    max = arr[i];
            }
            return max;
        });
        System.out.println(max1);
    }

    private static Integer getInteger(Supplier<Integer> sup){
        return sup.get();
    }
    public static String getString(Supplier<String> sup){
        return sup.get();
    }

    public static Integer getMax(Supplier<Integer> sup){
        return sup.get();
    }


}

4.2-Consumer

消费者接口,对一些数据进行操作,不需要进行返回


import java.util.function.Consumer;

/**
 * @author Object(object_hui@sina.com)
 * @description 消费函数lambda
 * @date 2020/9/23
 */
public class ConsumerDemo {
    public static void main(String[] args) {
        //消费两次,进行打印输出
        runConsumer("伊利丹.怒风",s -> System.out.println(s),s -> System.out.println(s));
        //使用引用替代
        runConsumer("伊利丹.怒风",System.out::println,System.out::println);
    }
    //将字符串name进行消费,先由con1消费,再由con2消费
    private static void runConsumer(String name, Consumer<String> con1,Consumer<String> con2){
        con1.andThen(con2).accept(name);
    }
}

  • 小应用:使用Consumer将数组中的内容按照指定的格式输出
import java.util.function.Consumer;

/**
 * @author Object(object_hui@sina.com)
 * @description 使用Consumer将字符串数组按规定输出
 * @date 2020/9/23
 */
public class ConsumerDemo02 {
    public static void main(String[] args) {
        String[] arr = {"伊利丹.怒风,102","卡尔萨斯,88","安吉娜,78"};
        runConsumer(arr,s -> System.out.print("姓名:"+s.split(",")[0]+"\t"),
                s -> System.out.println("\t年龄:"+s.split(",")[1]));
    }
    public static void runConsumer(String[] arr, Consumer<String> con1,Consumer<String> con2){
        for (String s:arr
             ) {
            con1.andThen(con2).accept(s);
        }
    }
}

4.3-Predicate

用于判断是否满足指定的条件的函数

import java.util.function.Predicate;

/**
 * @author Object(object_hui@sina.com)
 * @description Predicate小测试
 * @date 2020/9/23
 */
public class PredicateDemo {
    public static void main(String[] args) {
        //判断名字的长度是否大于2
        System.out.println(runPredicate("伊利丹.怒风",s -> s.length()>2));

    }
    //使用Predicate函数接口,对字符串进行判断
    public static boolean runPredicate(String name, Predicate<String> pre){
       return pre.test(name);
       //非的写法
//        return pre.negate().test(name);
    }
}

  • 小案例:筛选名字长度大于4,且年龄大于100的数据

    
    import java.util.ArrayList;
    import java.util.function.Predicate;
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 使用Predicate将字符串数组按规定输出
     * @date 2020/9/23
     */
    public class ConsumerDemo02 {
        public static void main(String[] args) {
            String[] arr = {"伊利丹.怒风,102","卡尔萨斯,88","安吉娜,78","格罗姆·地狱咆哮,103","沃金,133"};
            //条件1:名字长度大于4,条件2:年龄大于100
            ArrayList<String> list = runConsumer(arr, s -> s.split(",")[0].length() > 4,
                    s -> Integer.parseInt(s.split(",")[1]) > 100);
            System.out.println(list);
        }
        
        public static ArrayList<String> runConsumer(String[] arr, Predicate<String> pre1, Predicate<String> pre2){
            ArrayList<String> list = new ArrayList<>();
            for (String s:arr) {
                //满足两个条件则加入集合
                if (pre1.and(pre2).test(s))
                    list.add(s);
            }
            return list;
        }
    }
    
4.4-Function

加工函数

Function<T,R>:用于参数转换,把T加工成R

import java.util.function.Function;

/**
 * @author Object(object_hui@sina.com)
 * @description Function测试类,将String类型加工成Integer类型
 * @date 2020/9/24
 */
public class FunctionDemo {
    public static void main(String[] args) {
        //使用lambda表达式
        System.out.println(runFunction("1314",s -> Integer.parseInt(s)));
        //使用引用替代
        System.out.println(runFunction("1314",Integer::parseInt));
    }

    public static Integer runFunction(String s,Function<String,Integer> fun){
        return fun.apply(s);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值