函数式编程-常用的函数式接口

1 lambda作为参数和返回值

package com.stream.函数式编程.lambda作为参数和返回值;

/**
 * lambda作为参数和返回值
 *
 * @author zhaoshuai11
 * @date 2022/11/12
 */
public class LambdaAsParams {
    public static void main(String[] args) {
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " --> " + "Thread starting ...");
            }
        });

        startThread(() -> System.out.println(Thread.currentThread().getName() + " --> " + "Thread starting ..."));
    }

    /**
     * startThread
     *
     * @param runnable runnable
     */
    public static void startThread(Runnable runnable) {
        new Thread(runnable).start();
    }
}

/*
@FunctionalInterface
interface Runnable {
    public abstract void run();
}
*/

package com.stream.函数式编程.lambda作为参数和返回值;

import java.util.Arrays;
import java.util.Comparator;

public class LambdaAsReturn {
    public static void main(String[] args) {
        String[] strArr = {"aaa", "bbbb", "ddddd", "ss"};
        System.out.println(Arrays.toString(strArr));

        /**
         * public static <T> void sort(T[] a, Comparator<? super T> c)
         */
        Arrays.sort(strArr, getComparator());
        Arrays.sort(strArr, (o1, o2) -> o2.length() - o1.length());
        System.out.println(Arrays.toString(strArr));

    }

    /**
     * 定义一个方法-getComparator,方法的返回值是一个函数式接口Comparator<String>
     *
     * @return {@link Comparator}<{@link String}>
     */
    public static Comparator<String> getComparator() {
//        return new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o2.length() - o1.length();
//            }
//        };
        return (o1, o2) -> o2.length() - o1.length();
    }
}

2 lambda延时运行

package com.stream.函数式编程.lambda延时运行;

/**
 * 存在性能浪费问题: printLogByLevel()-传递的第二个参数是一个拼接后的字符串,先把字符串拼接,然后再调用printLogByLevel()。
 * 若日志级别 != 1,就造成性能的浪费。
 *
 * @author zhaoshuai11
 * @date 2022/11/12
 */
public class DelayRunning {
    public static void main(String[] args) {
        String msg_1 = "... msg 1 ...";
        String msg_2 = "... msg 2 ...";
        printLogByLevel(1, msg_1 + msg_2);
    }

    /**
     * printLogByLevel
     *
     * @param level level
     * @param msg   msg
     */
    public static void printLogByLevel(Integer level, String msg) {
        if (level == 1) {
            System.out.println(msg);
        }
    }
}


package com.stream.函数式编程.lambda延时运行;

/**
 * DelayRunningByLambda
 * lambda-延时运行
 * 优势:lambda作为参数,仅仅是把参数传递到printLogByLevel()。
 * 只有满足条件-才会调用MsgBuilder.buildMsg();
 * 若不满足条件-不会调用MsgBuilder.buildMsg();
 * 所以不会存在性能浪费。
 *
 * @author zhaoshuai11
 * @date 2022/11/12
 */
public class DelayRunningByLambda {
    public static void main(String[] args) {
        String msg_1 = "... msg 1 ...";
        String msg_2 = "... msg 2 ...";
        printLogByLevel(1, () -> msg_1 + msg_2);
    }

    /**
     * 打印日志级别
     * printLogByLevel
     *
     * @param level      level
     * @param msgBuilder msgBuilder
     */
    public static void printLogByLevel(Integer level, MsgBuilder msgBuilder) {
        if (level == 1) {
            System.out.println(msgBuilder.buildMsg());
        }
    }
}

/**
 * MsgBuilder
 *
 * @author zhaoshuai11
 * @date 2022/11/12
 */
@FunctionalInterface
interface MsgBuilder {
    String buildMsg();
}

3 ConsumerInterface

package com.stream.函数式编程.常用的函数式接口.ConsumerInterface;

import com.google.common.collect.Lists;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * ConsumerTest-消费式函数式接口
 *
 * @author zhaoshuai11
 * @date 2022/11/12
 */
public class ConsumerTest {
    public static void main(String[] args) {
        List<Integer> listNew = Lists.newArrayList();
        /**
         *         Consumer<Integer> processor = new Consumer<Integer>() {
         *             @Override
         *             public void accept(Integer value) {
         *                 putIntegerToList(listNew, value);
         *             }
         *         };
         */
        Consumer<Integer> processor = value -> putIntegerToList(listNew, value);
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        /**
         *         for (Integer integer : list) {
         *             processor.accept(integer);
         *         }
         */
        list.forEach(processor);
        System.out.println(listNew);
    }

    public static void putIntegerToList(List<Integer> list, Integer value) {
        list.add(value);
    }
}

package com.stream.函数式编程.常用的函数式接口.ConsumerInterface;

import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerTestAndThen {
    public static void main(String[] args) {
//        andThenTest();
        formatInfo();
    }

    /**
     * formatInfo
     */
    private static void formatInfo() {
        List<String> list = Lists.newArrayList();
        String[] array = {"迪丽热巴,女", "古力娜扎,女", "马儿扎哈,男"};
        Consumer<String> processor = info -> {
            String[] split = info.split(StrUtil.COMMA);
            list.add("姓名:" + split[0] + " " + "性别:" + split[1]);
        };
        Arrays.asList(array).forEach(processor);
        System.out.println(list);
    }

    /**
     * andThenTest
     */
    private static void andThenTest() {
        List<String> list_1 = Lists.newArrayList();
        List<String> list_2 = Lists.newArrayList();
        Consumer<String> processor_1 = e -> list_1.add(e.toLowerCase());
        Consumer<String> processor_2 = e -> list_2.add(e.toUpperCase());
        /**
         *         Consumer<String> action = processor_1.andThen(processor_2);
         *         for (String s : Arrays.asList("hEllo", "World")) {
         *             action.accept(s);
         *         }
         */
        Arrays.asList("hEllo", "World")
                .forEach(processor_1.andThen(processor_2));
        System.out.println(list_1);
        System.out.println(list_2);
    }
}

4 SupplierInterface

package com.stream.函数式编程.常用的函数式接口.SupplierInterface;

import java.util.function.Supplier;

/**
 * @FunctionalInterface 用来获取一个泛型参数指定类型的对象数据类型
 * public interface Supplier<T> {
 * T get();
 * }
 */
public class SupplierTest {
    public static void main(String[] args) {
        String string = getString(() -> "hello supplier");
        System.out.println(string);
    }

    /**
     * 生产型接口-supplier
     *
     * @param supplier 函数式-Supplier<String> supplier
     * @return {@link String}
     */
    public static String getString(Supplier<String> supplier) {
        return supplier.get();
    }
}

package com.stream.函数式编程.常用的函数式接口.SupplierInterface;

import com.google.common.collect.Lists;

import java.util.Collections;
import java.util.function.Supplier;

/**
 * @FunctionalInterface
 * public interface Supplier<T> {
 * T get();
 * }
 */
public class MaxValue {
    public static void main(String[] args) {
        Integer[] arrValue = {1, 2, 100, 0, 99};
        /**
         *         Supplier<Integer> processor = new Supplier<Integer>() {
         *             @Override
         *             public Integer get() {
         *                 return Collections.max(Lists.newArrayList(arrValue));
         *             }
         *         };
         */
        Supplier<Integer> processor = () -> Collections.max(Lists.newArrayList(arrValue));
        System.out.println(processor.get());
    }
}

5 PredicateInterface

package com.stream.函数式编程.常用的函数式接口.predicateInterface;

import cn.hutool.core.util.StrUtil;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * PredicateInterface
 * 对某种数据类型的数据进行判断,结果返回一个Boolean
 *
 * @author zhaoshuai11
 * @FunctionalInterface
 * public interface Predicate<T> {
 * boolean test(T t);
 * }
 * @date 2022/11/12
 */
public class PredicateInterface {
    public static void main(String[] args) {
        predicateInfoTest();
    }

    /**
     * predicateTest
     */
    public static void predicateTest() {
        /**
         *         Predicate<String> processor = new Predicate<String>() {
         *             @Override
         *             public boolean test(String fistName) {
         *                 return fistName.equals("zhaoShuai11");
         *             }
         *         };
         */
        Predicate<String> processor = fistName -> fistName.equals("zhaoShuai11");
        List<String> list = Arrays.asList("zhaoshuai11", "zhaoShuai11");
        list.stream()
                .filter(processor)
                .forEach(System.out::println);
    }

    /**
     * andPredicateTest
     */
    public static void andOrPredicateTest() {
        List<String> list = Arrays.asList("zhao", "zhaoShuai11");
        /**
         * fun1
         *         Predicate<String> processor = new Predicate<String>() {
         *             @Override
         *             public boolean test(String str) {
         *                 return str.length() > 5 && str.contains("a");
         *             }
         *         };
         */
        System.out.println("-------and---------");
        Predicate<String> processor = str -> str.length() > 5 && str.contains("a");
        list.stream()
                .filter(processor)
                .forEach(System.out::println);

        Predicate<String> processor_1 = str -> str.length() > 5;
        Predicate<String> processor_2 = str -> str.contains("a");
        list.stream()
                .filter(processor_1.and(processor_2))
                .forEach(System.out::println);

        System.out.println("-------or---------");
        Predicate<String> processor_or = str -> str.length() > 5 || str.contains("a");
        list.stream()
                .filter(processor_or)
                .forEach(System.out::println);

        Predicate<String> processor_3 = str -> str.length() > 5;
        Predicate<String> processor_4 = str -> str.contains("a");
        list.stream()
                .filter(processor_3.or(processor_4))
                .forEach(System.out::println);

        System.out.println("--------negate--------");
        Predicate<String> processor_negate = str -> str.length() > 5 || str.contains("a");
        list.stream()
                .filter(processor_negate.negate())
                .forEach(System.out::println);
    }

    private static void predicateInfoTest() {
        List<String> list;
        String[] array = {"迪丽热巴,女", "古力娜扎,女", "马儿扎哈,男"};
        Predicate<String> processor = str -> {
            String[] split = str.split(StrUtil.COMMA);
            return split[0].length() == 4 && split[1].equals("女");
        };
        list = Arrays.stream(array)
                .filter(processor)
                .collect(Collectors.toList());
        System.out.println(list);
    }
}

6 FunctionInterface

package com.stream.函数式编程.常用的函数式接口.FunctionInterface;

import com.google.common.collect.Lists;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;


/**
 * @author zhaoshuai11
 * @FunctionalInterface public interface Function<T, R> {
 * R apply(T t);
 * }
 * 根据一个数据类型的数据得到另一个数据类型的数据,前者T称之为前置条件,后者R称之为后置条件。
 * @date 2022/11/12
 */
public class FunctionTest {
    public static void main(String[] args) {
        functionInfoTest();
    }

    /**
     * string2Integer
     */
    public static void string2Integer() {
        List<Integer> list;
        String[] array = {"111", "234", "355"};
        Function<String, Integer> processor = Integer::parseInt;
        list = Arrays.stream(array)
                .map(processor)
                .collect(Collectors.toList());
        System.out.println(list);
    }

    /**
     * andThenFunction
     * 1、String -> Integer
     * 2、Integer + 10
     * 3、Integer -> String
     */
    public static void andThenFunction() {
        String[] array = {"111", "234", "355"};
        List<String> list = Lists.newArrayList();

        Function<String, String> processor = t -> String.valueOf(Integer.parseInt(t) + 10);
        list = Arrays.stream(array)
                .map(processor)
                .collect(Collectors.toList());
        System.out.println(list);

        Function<String, Integer> processor_1 = e -> Integer.parseInt(e) + 10;
        Function<Integer, String> processor_2 = String::valueOf;
        list = Arrays.stream(array)
                .map(processor_1.andThen(processor_2))
                .collect(Collectors.toList());
        System.out.println(list);
    }

    /**
     * functionInfoTest
     */
    private static void functionInfoTest() {
        String str = "杨幂,20";
        Function<String, Integer> processor = e -> Integer.parseInt(e.split(",")[1]) + 100;
        System.out.println(processor.apply(str));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值